在JavaScript中,我遇到过以两种主要方式编写的代码,用于连接在.concat()
对象上使用Array
方法的两个(或更多)数组。 (假设,在下文中,arr1
和arr2
是作为.concat()
方法的参数给出的通用数组。有时,我看到
arr1.concat(arr2)
而在其他地方,我看到使用了以下内容:
[].concat(arr1, arr2)
在实践中,我没有发现两种表达方式之间存在任何可观察到的差异。都不会改变原始数组。两者都返回相同的输出。
有什么不同,如果有的话?是否比另一个表现更好?最佳实践是否特别建议一个人?
非常感谢所有帮助/反馈!
修改
对JSPerf基准测试进行了分析。正如一些评论中所指出的那样,与arr1.concat(arr2)
相比,[].concat(arr1, arr2)
似乎是首选(和更自然的语法)。 (我想这有点主观,但回想起来大多数人会同意)。即便如此,如果没有其他原因,只要稍微提高它的性能,就可以选择以前的语法。
答案 0 :(得分:1)
实际上,使用[].concat(arr1, arr2)
,默认设置结果必须是数组。你可以连接字符串和数组,或只是字符串或只有数组 - 结果将始终是一个数组。
如果您希望结果为string
,请在开头使用空引号而不是空数组。
console.log([].concat([1,2,3], 'text'));
console.log([].concat('text', 'new'));
console.log(''.concat([1,2,3], [4,5,6]));

使用arr1.concat(arr2)
,第一个元素的类型 - 在本例中为arr1
,将是新制作对象的默认类型。因此,如果arr1
是字符串,即使arr2
是数组 - 结果也是string
的类型。
console.log([1,2,3].concat('text'));
console.log('text'.concat([1,2,3]));

在这两种情况下 - 原始数组或字符串都没有被改变。
关于表现 - 他们之间没有明显的差异。
答案 1 :(得分:1)
如果arr1
和arr2
都是普通数组,那么绝对没有区别。它只是两个相同的符号,一个是面向对象的,另一个是更具功能性的。有人可能会说[].concat(…)
效率较低,因为它必须构造并迭代一个空数组,但这几乎不可测量。
虽然arr1
不 Array
,但可以观察到差异。显然,它可能会调用不同的concat
方法,甚至在没有方法时抛出(或者当arr1
为null
或undefined
时抛出);但是当它调用Array.prototype.concat
方法时,arr1
也不会checked for being spreadable。