今天学习的时候遇到了[ ].shift.call(arguments),当时不是很理解这句话的意思,于是就查了资料,所以在这里记录一下:
关于这个的解释,在网上可以看到很多,大部分解释就是说,因为arguments不是数组对象,它是一个类数组对象,所以不能调用数组的方法,所以我们就需要把 “把类数组对象转为数组对象”。但是这样写确实能实现我们想要的功能,但是我们并没有理解它的内在原理!!!
var key = [].slice.call( arguments )
// 也就是等效于
var key = Array.prototype.slice.call( arguments )
在这里,slice()是数组上的一个方法,它不改变原数组,而是从原数组中返回指定的元素,也就是一个新的数组,当没有传入任何参数的时候也就是会返回整个数组(复制原数组,不改变原数组);然后是 call 函数,它和 apply 函数一样,他们两个都是改变函数的 this 指向,区别就是参数不一样,他们的第一个参数都是一个对象或者是 “this”,而 apply 的第二个参数是一个数组,call 后面可以继续跟多个参数,也就是 apply ( this,[ ] );call ( this , n1,n2,n3....)
所以重点就是:
因为slice内部实现是使用的this为代表调用对象,那么当[ ].slice.call() 传入 arguments 对象的时候,通过 call 函数改变原来 slice 方法的 this 指向, 使其指向 arguments,并对 arguments 进行复制操作,然后返回一个新数组。所以就达到了把 arguments 类数组转为数组的目的!
当然,[ ].shift.call( arguments ) 也是如此,shift () 方法为删除数组的第一项,并返回删除项,所以这句我们可以理解为 “ 删除arguments的第一项并返回,也就是拿到 arguments 的第一项 ”。