为什么返回值是这个。
console.log([].concat.apply([],[1,2,[3,4,[5,6]]]))
//[1, 2, 3, 4,[5,6]]
为什么返回值是这个。
console.log([].concat.apply([],[1,2,[3,4,[5,6]]]))
//[1, 2, 3, 4,[5,6]]
先给你看看简单的例子,你了解下apply。
function add(a, b) {
return a + b
}
add.apply(sub, [5, 3]); //8
上面的例子可以看出,apply的作用是把add(即this)绑定到sub,这时候sub具备了add的属性和方法add.apply(sub, [5, 3])等价于add(5, 3)。这里为什么是5, 3不是[5, 3]你可以了解下apply和call的区别。
同理,[].concat.apply([],[1,2,[3,4,[5,6]]])可以看成是
[]具备了[].concat的属性和方法,此时[].concat.apply([],[1,2,[3,4,[5,6]]])等价于[].concat(1,2,[3,4,[5,6]]).
[].concat(1,2,[3,4,[5,6]])的功能主要集中在concat上(可以参考http://www.w3school.com.cn/jsref/jsref_concat_array.asp),
concat函数中的参数可以是数组也可以是值,此处相当于[]拼接了两个**数值**1, 2和**数组**[3, 4, [5, 6]]
[]拼接1, 2 => [1, 2]
[1, 2]拼接[3, 4, [5, 6]] => [1, 2, 3, 4, [5, 6]
10 回答11.7k 阅读
2 回答3.2k 阅读✓ 已解决
5 回答2.2k 阅读
3 回答1.6k 阅读✓ 已解决
3 回答2.7k 阅读✓ 已解决
5 回答747 阅读
4 回答2.2k 阅读✓ 已解决
楼上正解 apply会将arr类型的参数转换为参数序列也就是说[1,2,[3,4,[5,6]]]其实不是要合并的数组,而是[1],[2],[3,4,[5,6]],这三个数组会依次合并
可以尝试一下把apply换成call 看一下输出的结果 就明白了 主要是apply这个方法的特殊性