在谈论这个问题之前 我们先了解下call的用法及作用
对象.方法.call(obj[,arg1[, arg2[, [,.argN]]]]]):调用一个对象的一个方法,以另一个对象替换当前对象。
1 function Personal(a){ 2 3 this.name = a; 4 5 this.say = function(){ 6 7 alert(a) 8 } 9 10 } 11 12 function Man(a){ 13 14 this.sex = "maie"; 15 Personal.call(this,a) 16 17 } 18 var oa = new Man("oa"); 19 oa.say();
此处将Person的属性继承到了Man上 Man中的Person.call(this)中将Person中的this指向重新定向到
了Man上;
接着我么就来看下 数组的slice方法;
定义和用法
slice() 方法可从已有的数组中返回选定的元素。
语法
arrayObject.slice(start,end)
参数 | 描述 |
---|---|
start | 必需。规定从何处开始选取。如果是负数,那么它规定从数组尾部开始算起的位置。也就是说,-1 指最后一个元素,-2 指倒数第二个元素,以此类推。 |
end | 可选。规定从何处结束选取。该参数是数组片断结束处的数组下标。如果没有指定该参数,那么切分的数组包含从 start 到数组结束的所有元素。如果这个参数是负数,那么它规定的是从数组尾部开始算起的元素。 |
返回值
返回一个新的数组,包含从 start 到 end (不包括该元素)的 arrayObject 中的元素。
个人理解
此处的Array.prototype.slice.call(arguments);是将arguments转化成相应的数组;
如何转化的关键应该就在于slice这个方法中;
我们可以这么理解 slice方法;
1 Array.prototype.slice = function(start,end){ 2 var self = this,len = self.length; 3 start = start?start<0?start+len:start:0; 4 end = end ? end<0?end+len:end : len ; 5 var arr = []; 6 // console.log(start,end) 7 for(var i=start;i<end;i++){ 8 arr.push(self[i]); 9 } 10 return arr; 11 }
这个当中this指向的是Array数组是有length属性的 它就能执行下方的循环操作 ;而此处的Array.prototype.slice.call(arguments,0)调用的slice方法他的this指向的是类数组的arguments;它同样具有length属性;所以 可以将函数中的参数集合转化成数组格式;
由此可以衍生出的Array.prototype.slice.call({0:1,1:2,2:3,length:3},0) ==>[1,2,3]
Array.prototype.slice.call({0:1,3:3,length:4},0) ==>[1, undefined × 2, 3]||[1, undefined , undefined , 3];
等类数组转化成数组的方式
时间: 2024-10-31 20:53:17