对象/数组方法:修改原始文件还是创建新文件?方针

时间:2014-05-22 16:41:24

标签: javascript object methods standards

使用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

这让我想知道在创建可用于Object或Array的方法时是否有任何标准或最佳实践?

我还没有找到,它们是否存在?

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

1 个答案:

答案 0 :(得分:1)

The ECMAScript Language Specification 5.1 (2011)没有概述为什么某些方法会修改原始对象以及为什么其他方法没有。

仅举例说明Array.prototype.map15.4.4.19

  

map 不直接改变调用它的对象,但是   通过调用callbackfn可以突变对象。

没有说明为什么会出现这种情况的原因。

但是,对于修改原始对象的方法,似乎没有在方法的一般描述之外做出特别注意。 Array.prototype.sort15.4.4.11)定义中的一个示例:

  

此数组的元素已排序。 [其余定义如下。]

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