为什么[array] .concat()和[array] .concat.apply()给出不同的输出?

时间:2016-07-16 18:23:48

标签: javascript

以下代码,

console.log([].concat.apply([2],[[99],5,6,[2,3]]));

输出

[ 2, 99, 5, 6, 2, 3 ]

以下代码,

console.log([2].concat([99]).concat([5,6,[2,3]]));

输出

[ 2, 99, 5, 6, [ 2, 3 ] ]

我的假设是

的输出
console.log([].concat.apply([2],[[99],5,6,[2,3]]));

应该是

[2,[99],5,6,[2,3]]

但不是,为什么?

4 个答案:

答案 0 :(得分:2)

你在没有看到document的情况下假设。请参阅concat的实际语法是

Array.prototype.concat ( [ item1 [ , item2 [ , … ] ] ] )

所以你的代码几乎等于,

[].concat.apply([itm1], [itm2,itm3,itm4]...)

从您的代码的角度来看,您的代码类似于

[2].concat([99],5,6,[2,3]);

让我们拆除你的代码,

console.log([].concat.apply([2],[[99],5,6,[2,3]]));
// 1. apply will call the function by applying the parameter supplied as an array.
// 2. so the first parameter for apply would be this for that function
// 3. and the second parameter for it would be the arguments in an array form.
// 4. Hence internally apply will call the function concat as,
//    [2].concat([99],5,6,[2,3]); //[2] will be 'this'

但是根据您的要求,您不需要使用apply,您可以使用call

console.log([].concat.call([2],[[99],5,6,[2,3]]));
//[2,[99],5,6,[2,3]]

答案 1 :(得分:2)

那是因为:

console.log( [].concat.apply([2],[[99],5,6,[2,3]]) );

相当于:

console.log( [2].concat([99], 5, 6, [2,3]) );

.concat获取多个参数,并将所有数组(和非数组参数)合并为一个数组。基本上,数组参数得到解压缩1级。

要获得该输出,您必须将每个数组元素包装在另一个数组中。

console.log( [].concat.apply([2],[[[99]],5,6,[[2,3]]]) );

也许您更愿意使用基于.push的方法。



var a = [2];
a.push.apply(a, [[99],5,6,[2,3]]);
console.log(a);




答案 2 :(得分:0)

如果您参考concat MDN,您会发现Array.prototype.concat的语法是

var new_array = old_array.concat(value1[, value2[, ...[, valueN]]])

而不只是值。数组和/或值以连接成新数组

所以[].concat.apply([],[2,3,[6,4]])等于[].concat.apply([],[2,3,6,4])

答案 3 :(得分:0)

请注意,apply实际上是第二个参数的 spread 运算符。所以

相同的结果:

console.log([].concat.apply([2],[[99],5,6,[2,3]]));


console.log([2].concat(...[[99],5,6,[2,3]])); // * using es6 spread operator `...`


console.log([2].concat([99],5,6,[2,3]));

与以下内容不同:

console.log([2].concat([[99],5,6,[2,3]]));

差异是点差。