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