首先你要具备如下知识:
-
[]是什么? -
[].slice.call是什么? -
arguments是什么?
我们逐一来看:
[]是什么?
[]是js语法中创建一个新数组的意思,看如下代码:
var a = [];
var b = new Array();
这两种写法并无二致。
[].slice.call是什么?
首先你知道[]是一个数组,那么[].slice是它的一个方法,是一个函数。
它的作用是返回数组中的某一段,看如下代码:
var a = [1, 2, 3, 4, 5];
var b = a.slice(2);
// b是a从2号位开始的片段
// 也就是[3, 4, 5]
在js中,函数本身也是一种对象,也是具有属性和方法的,call就是其中之一。
它的第一个参数,是指定函数执行时的this指针,后面的参数,就是函数执行的参数。
具体的不展开讲,你可以查阅MDN: Function.prototype.call()
看如下代码:
var a = function (n) {
console.log(this, n);
}
var b = {};
a(1); // log出Window对象, 1
a.call(b, 2); // log出b对象, 2
所以说[].slice.call(arguments, 1)实际上相当于(并不一定等同于):
arguments.slice(1);
arguments是什么
arguments可以看做一个数组。每一个js函数内部都有arguments,它代表传入的参数数组。
看如下代码:
function a() {
console.log(arguments);
}
a(1, 2, 3); // log出[1, 2, 3]
现在你应该明白了,[].slice.call(arguments, 1)返回的是arguments数组从1号位开始的片段。
看如下代码:
function a() {
var args = [].slice.call(arguments, 1);
console.log(args);
}
a('haha', 1, 2, 3, 4, 5); // log出[1, 2, 3, 4, 5]
a('run', '-g', '-b'); // log出['-g', '-b']