今天看《JavaScript设计模式与开发实践》发现的一个问题P50
问题描述:
数组需要push入函数的内置对象arguments时,为何使用[].push.apply(arr, arguments)
而不使用arr.push(arguments)
?
简化代码:
function () {
var args = [];
return function(){
[].push.apply(args, arguments); //为何不使用args.push(arguments)?
}
}
然后在浏览器的控制台进行测试
测试结果
args.push(arguments)
[Arguments(2)] //push进去的是一个Arguments对象
再回过头来看一下apply的定义
定义
apply接受两个参数,第一个参数指定了函数体内this对象的指向,第二个参数为一个带有下标的集合,这个集合可以为数组,也可以为类数组,apply方法把这个集合中的元素作为参数传递给调用的函数。
猜想
apply传入参数的处理跟ES6的...符号一样,可以将数组内部的元素拆分开来当作一个个参数处理。
胡思乱想
等等,我现在很好奇,如果传入的参数是Object对象的话会怎么样,是不是跟...符号一样会被拆分呢?应该是不会的,因为参数规定为数组或类数组,不过我们还是试一下。
三分钟过后,
用对象作为参数,数组并没有变化,也不会报错(所以还是很需要类型检测这种东西)。
结论
apply方法的参数可以很方便的将数组或类数组进行拆分并将其作为参数传入需要执行的函数中。
如果需要将一个数组或类数组中的元素放到另一个数组中,可以使用这样一种方式。
另外就是尽量避免传入一个错误的类型,虽然说不会有什么问题,但是也并没有什么用。