对象/数组方法:修改原始的还是创建新的?指导方针

Object/Array methods: Modify original or create new? Guidelines

本文关键字:创建 指导方针 原始 数组 方法 修改 对象      更新时间:2023-09-26

在javascript中,我们有filtermap这样的方法,它们不修改原始数组,而是根据提供的函数创建一个新数组。

我们也有像sort这样的方法来修改原始数组。

以上是ECMA标准的一部分。

我还在库或gist中看到定制的函数,它们不符合任何标准或最佳实践。

shuffle这样的东西,经常使用像Fisher–Yates这样的算法,90%的时间修改原始数组,但偶尔会创建一个新数组。

compress这样的方法删除了数组中的holes,同样经常修改原始数组,但有时会创建一个新数组。

因此,在调查uniqueremoveDuplicates时,我发现了3种可能性。

function unique(array) {
    create newArray;
    push unique values into newArray;
    return newArray;
}

上面的代码创建了一个包含唯一值的新数组,而原始数组保持不变。

function unique(array) {
    remove duplicates from original array;
    return array;
}

上面的操作修改了原数组,并返回了对原数组的引用。

function unique(array) {
    create removedArray;
    remove duplicates from original array and push the removed elements into removedArray;
    return removedArray,
}

上面的代码与前面的类似,只是它记录了删除的元素并将它们返回给我,有点像splice

这一切都让我想知道是否有任何标准或最佳实践,当它涉及到创建工作在对象或数组的方法?

我没有找到,它们存在吗?

如果不是,那么我知道这个问题可能会导致基于意见的答案,但这似乎是一个明智的问题?

ECMAScript语言规范5.1(2011)没有概述为什么某些方法修改原始对象,以及为什么其他方法不修改。

作为一个例子,它只概述了Array.prototype.map (15.4.4.19)

map不会直接改变调用它的对象对象可能通过调用callbackfn而发生变异。

,但没有说明原因。

然而,对于确实修改原始对象的方法,在方法的一般描述之外似乎没有特别的注意。Array.prototype.sort(15.4.4.11)定义中的一个例子:

数组中的元素已排序。

总结一下:
在原始对象未被修改的情况下,对其进行显式注释,而在原始对象修改的情况下,不添加特别通知。因此,似乎有一个隐含的标准,这些方法修改原始对象,但没有明确的协议或规范。