对 Array.prototype.slice.call() 和 Array.prototype.slice.apply() 的简要理解
1. 逐步拆分解析
- slice:可从已有的数组中返回选定的元素,不改变原数组。
注:有关 splice 方法的详解可参考 有关 Array.prototype.slice() 方法的详解 - Array:
Array 是 javascript 的一个引用类型,Array.prototype 属性表示 Array 构造函数的原型,其上有一个方法叫 slice() 。 注:因此, Array.prototype.slice.call(arguments, 1) 也可以写成 [].slice.call(arguments, 1) - call 和 apply : 可以简单理解为用来改变对象中函数内部的
this 引用指向。apply() 和 call() 方法的第一个参数都是特定的作用域,用来替换对象函数中的 this ;第二个参数都是要传递给对象函数的参数,不同之处是 apply() 的第二个参数可以是数组实例或 arguments 类数组对象,call() 则需要逐个列出需要传递的参数。
2. 原理(此处以 call 为例说明)
??Array.prototype.slice.call(arguments, number) 的原理为:首先第一个参数 arguments 改变数组的 slice() 方法的作用域(即 this 的指向),使 this 指向 arguments 对象,然后 call() 方法的第二个参数 number 作为传递给 slice() 的参数(截取数组的起始位置)。
??进行上述操作后, arguments 类数组(伪数组)就可以使用数组的方法 slice() 了(伪数组并不是真正的数组,是不可以使用 Array 的相关方法的)。
总结起来可简单理解为: Array.prototype.slice.call(arguments, number) 能够将具有 length 属性(必须包含 length 属性)的对象转换为数组,其意义就在于它能将函数的参数对象转化为一个真正的数组。
3. 示例
① arguments 形式
function test(m, n, p, q) {
var arg = Array.prototype.slice.call(arguments, 1);
alert(arg);
}
test("a","b","c","d");
② 伪数组形式
var obj = {0:'hello', 1:'world', length:2};
console.log(Array.prototype.slice.call(obj, 0));
var obj = {0:'hello',1:'world'};
console.log(Array.prototype.slice.call(obj, 0));
|