Array.prototype. slice.call(arguments)能够将具有length属性的对象转化为数组,
var a={length:2,0:'first',1:'second'};
Array.prototype.slice.call(a);// ["first", "second"]
先看call的用法:
var a = function(){
console.log(this); // 'littledu'
console.log(typeof this); // Object
console.log(this instanceof String); // true
}
a.call('littledu');
call的用法就是把a对象的作用域作用到传入的参数中去(也可以说传入参数在a对象的环境中执行)。
再来看slice方法的原理:
Array.prototype.slice = function(start,end){
var result = new Array();
start = start || 0;
end = end || this.length; //this指向调用的对象,当用了call后,能够改变this的指向,也就是指向传进来的对象,这是关键
for(var i = start; i < end; i++){
result.push(this[i]);
return result;
}
最后介绍下转成数组的通用方法:
var toArray = function(s){
try{
return Array.prototype.slice.call(s);
} catch(e){
var arr = [];
for(var i = 0,len = s.length; i < len; i++){
//arr.push(s[i]);
arr[i] = s[i]; //据说这样比push快
}
return arr;
}
}
网友评论