Array.prototype.slice.call

看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
    原文地址: https://segmentfault.com/a/1190000002537968
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞