官网上的 “数组连接使用concat()” 概念是不是有问题

w3c 上这样定义concat():连接两个或更多的数组,并返回结果

我们可以这样:

var arr = [1,2,[3,4]]
[].concat(...arr) // 输出[1,2,3,4]

但是又有以下输出:

console.log(...[1,2,[3,4]]) // 输出 1 2 [3, 4]

这明显...[1,2,[3,4]] 的运算结果不是一个数组啊,怎么能直接使用[].concat(...arr)

------------------------答案分割线-----------------------------
先来看一个现象:

[].concat(1,2) // 输出[1,2]
[].concat(1,2,[3,4]) //输出[1,2,3,4]
真正的官网上给出的解释是:
   When the concat method is called with zero or more arguments item1, item2, etc., it returns an array containing the array elements of the object followed by the array elements of each argument in order.
阅读 3.4k
4 个回答

js是一个不那么严谨的语言,w3c所说的是concat的本意,但具体实现时却做了引申和扩展,使得concat不但可以接受数组,还可以接受非数组。

这种例子在js里还有很多。比如parseInt可以接受字符串也可以接受其他类型的参数。按照该函数的本意应该只能接受字符串。再比如js可以允许非可执行代码作为语句,如将一个字符串作为一条语句(是否立马想到了use strict?),这在很多语言中是不允许的。

concat定义的初衷是用来拼接两个或多个数组,当然他不仅仅是拼接数组,你可以理解为他是拼接多个元素到数组中,如果他的参数是数组,则打散参数中的数组,以单个元素形式拼接到新数组中

[].concat([1,[2]],[3]); //[1, [2], 3]

除了拼接数组,concat还可以拼接字符串''.concat(1,2,[3,4]); //"123,4"

还能不能仔细看文档了。。

clipboard.png

推荐问题