看jquery源码看到的,进修一下:
Array.prototype.slice.call(arguments,0)该语句触及两个知识点。
arguments是一个关键字,代表当前参数
知识点1、call()的用法
var a = function(){
console.log(this); // 'littledu'
console.log(typeof this); // Object
console.log(this instanceof String); // true
}
a.call('littledu');
知识点2、slice( )的用法
slice( ) returns a string containing a slice, or substring, of string.
It does not modify string。 slice()返回一个子片断,对本来的string没有影响,还可以用负数当参数。
//string.slice(start,end),假如end这个参数没有被设置,则返回从start最先到最后
var s = "abcdefg";
s.slice(0,4) // Returns "abcd"
s.slice(2,4) // Returns "cd"
s.slice(4) // Returns "efg"
s.slice(3,-1) // Returns "def"
s.slice(3,-2) // Returns "de"
s.slice(-3,-1) // Should return "ef";
//Array.slice()
var a = [1,2,3,4,5];
a.slice(0,3); // Returns [1,2,3]
a.slice(3); // Returns [4,5]
a.slice(1,-1); // Returns [2,3,4]
a.slice(-3,-2); // Returns [3];
除了一般用法,slice 常常用来将 array-like 对象转换为 true array。在jquery框架就有这类用法。
Array.prototype.slice.call(arguments,0);//将参数转换成真正的数组
call的作用是转变this的指向,就相当于arguments调用了,slice这个要领。0就是start=0,end没指定,所以返回全部arguments,这个时刻就转换成数组了。
为何不直接如许
arguments.slice(0)
由于:能用slice要领的,只需有length属性就行。虽然arguments有length属性,然则没有slice要领,所以呢,Array.prototype.slice()实行的时刻,Array.prototype已被call改成arguments了,由于满足slice实行的前提(有length属性),所以没有报错。