1

看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属性),所以没有报错。


dada86
993 声望22 粉丝

多努力一点点。