[].slice.call(arguments, 1) 可以看作是 Array.prototype.slice.call(arguments,1)
它是能够将具有length属性的对象转成数组,
首先我们要明确一点就是两个东西,第一是slice方法;
.slice() 方法可从已有的数组中返回选定的元素。
var arr = new Array(3)
arr[0] = "George"
arr[1] = "John"
arr[2] = "Thomas"
console.log(arr.slice(0)) // VM1450:5 ["George", "John", "Thomas"]
console.log(arr.slice(0,2)) // VM1620:5 ["George", "John"]
console.log(arr.slice(-1)) //VM1728:5 ["Thomas"]
可以看出slice() 方法是返回参数内给定的位置的新的数组;
.call():调用一个对象的一个方法,以另一个对象替换当前对象。
function add(a,b)
{
alert(a+b);
}
function sub(a,b)
{
alert(a-b);
}
add.call(sub,3,1);
这个例子中的意思就是用 add 来替换 sub,add.call(sub,3,1) == add(3,1) ,所以运行结果为:alert(4); // 注意:js 中的函数其实是对象,函数名是对 Function 对象的引用。
arguments 对象:arguments对象是比较特别的一个对象,实际上是当前函数的一个内置属性。arguments非常类似Array,但实际上又不是一个Array实例;它可以直接用来调用函数参数
function doAdd() {
if(arguments.length == 1) {
alert(arguments[0] + 5);
} else if(arguments.length == 2) {
alert(arguments[0] + arguments[1]);
}
}
doAdd(10); //输出 "15"
doAdd(40, 20); //输出 "60"
最后我们来看
Array.prototype.slice.call(arguments,1)
arguments是一个关键字,代表当前参数,在javascript中虽然arguments表面上以数组形式来表示,但实际上没有原生数组slice的功能,这里使用call方法算是对arguments对象不完整数组功能的修正,也就是说Array.prototype.slice.call(arguments)能够将arguments转成数组
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;
}
}
var a = new toArray(1,2,3)
console.log(a) // VM5723:14 [1, 2, 3]
var toArray = function(s){
try{
return Array.prototype.slice.call(arguments,1);
// 将arguments当作数组使用,并返回从1开始后的新的数组
} 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;
}
}
var a = new toArray(1,2,3)
console.log(a) // VM6028:14 [2, 3]