javascript:Array.prototype.slice.call(arguments)

咱们知道,Array.prototype.slice.call(arguments)能将具备length属性的对象转成数组,除了IE下的节点集合(由于ie下的dom对象是以com对象的形式实现的,js对象与com对象不能进行转换)
如:
1 var a={length:2,0:'first',1:'second'}; 2 Array.prototype.slice.call(a);// ["first", "second"] 3 4 var a={length:2}; 5 Array.prototype.slice.call(a);// [undefined, undefined]

可能刚开始学习js的童鞋并非很能理解这句为何能实现这样的功能。好比我就是一个,因此,来探究一下。数组

首先,slice有两个用法,一个是String.slice,一个是Array.slice,第一个返回的是字符串,第二个返回的是数组,这里咱们看第2个。dom

Array.prototype.slice.call(arguments)可以将arguments转成数组,那么就是arguments.toArray().slice();到这里,是否是就能够说Array.prototype.slice.call(arguments)的过程就是先将传入进来的第一个参数转为数组,再调用slice?
 
再看call的用法,以下例子
复制代码
1 var a = function(){ 2 console.log(this); // 'littledu' 3 console.log(typeof this); // Object 4 console.log(this instanceof String); // true 5 } 6 a.call('littledu');
复制代码
能够看出,call了后,就把当前函数推入所传参数的做用域中去了,不知道这样说对不对,但反正this就指向了所传进去的对象就确定的了。
到这里,基本就差很少了,咱们能够大胆猜一下slice的内部实现,以下
复制代码
1 Array.prototype.slice = function(start,end){ 2 var result = new Array(); 3 start = start || 0; 4 end = end || this.length; //this指向调用的对象,当用了call后,可以改变this的指向,也就是指向传进来的对象,这是关键 5 for(var i = start; i < end; i++){ 6 result.push(this[i]); 7  } 8 return result; 9 }
复制代码
相关文章
相关标签/搜索
本站公众号
   欢迎关注本站公众号,获取更多信息