使用javascript我们有filter
和map
之类的方法,它们不会修改原始数组,而是根据提供的函数创建一个新数组。
我们还有像sort
这样的方法来修改原始数组。
以上是ECMA标准的一部分示例。
我还看到图书馆或GIST中的定制功能,不符合任何标准或最佳实践。
shuffle
之类的东西,经常使用像Fisher–Yates
这样的算法,其中90%的时间会修改原始数组但偶尔会创建一个新数组。
像compress
这样的方法可以删除数组中的holes
,同样经常修改原始数组,但有时会创建一个新数组。
因此,在调查unique
或removeDuplicates
时,我遇到了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的方法时是否有任何标准或最佳实践?
我还没有找到,它们是否存在?
如果没有,那么我知道这个问题可以导致基于意见的答案,但这似乎是一个明智的问题吗?
答案 0 :(得分:1)
The ECMAScript Language Specification 5.1 (2011)没有概述为什么某些方法会修改原始对象以及为什么其他方法没有。
仅举例说明Array.prototype.map
(15.4.4.19)
map 不直接改变调用它的对象,但是 通过调用
callbackfn
可以突变对象。
没有说明为什么会出现这种情况的原因。
但是,对于做修改原始对象的方法,似乎没有在方法的一般描述之外做出特别注意。 Array.prototype.sort
(15.4.4.11)定义中的一个示例:
此数组的元素已排序。 [其余定义如下。]
总结一下:
在原始对象未修改的情况下,会对其进行明确说明,而在原始对象 修改的情况下,不会添加特殊通知。因此,似乎有一个隐含的标准,这些方法修改原始对象,但没有明确的协议或规范。