以下代码,
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]]
但不是,为什么?
答案 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]]));
差异是点差。