我想将两个数组合并为一个。我发现有两个功能可以完成这项工作;一个是jQuery.merge()
,另一个是 JavaScript 内置函数concat()
。他们似乎做同样的事情,我发现了这个。它说:“合并创建了一个更小的占用空间,因为它循环遍历原始数组并添加新项目。Concat 是一个内置的 Javascript 函数,应该更快,但占用空间更大。” 我不确定这个说法是否属实,还有其他区别吗?
2 回答
该引用是正确的,这两个函数实际上并没有做同样的事情,一个将两个数组合并到一个(第一个参数)中,第二个从两者构建一个新数组。
它所指的“足迹”是在任何时候都将使用的最大内存量。由于合并只会复制第二个数组,它应该使用更少的内存,因为在任何时候,它只需要在内存中有 2 个数组。
内置函数需要有 3 个数组,并且新数组必须是被连接的两个数组的大小。
假设数组 A 和 B 中有 1000 个元素,合并后的数组为 C:
- 合并需要 1000+1000[a->c] 和 1000[b] 或 3000 个点。
- Concat 需要 1000+1000[c] 和 1000[a] 和 1000[b] 或 4000 个点。
如果使用大量内存,更少的内存可能会更快,更少的移动也可能更快。
在 tmaster 的情况下,他使用 jQuery.merge() 来合并 2 个数组。实际上,JQuery.merge 可以用来将 jQuery Object(jQuery Object has length prop too) 与 Array 合并。这里是 jQuery.merge() 的代码:
merge: function( first, second ) {
var len = +second.length,
j = 0,
i = first.length;
for ( ; j < len; j++ ) {
first[ i++ ] = second[ j ];
}
first.length = i;
return first;
},
因此,对于具有长度属性的 JQuery 对象,它可以使用合并将第二个 JQuery 对象属性(如 0,1)复制到第一个 JQuery 对象。这是一个示例:
pushStack: function( elems ) {
// Build a new jQuery matched element set
var ret = jQuery.merge( this.constructor(), elems );
...
return ret;
},
this.constructor() 也返回一个 jQuery 对象,元素。但是 concat 不能,只能与 Array 一起使用。这也是 concat 和 JQuery.merge 之间的差异。