我知道它是用来使参数成为一个真正的数组,但我不明白当使用Array.prototype.slice.call(参数);时会发生什么。
当前回答
当正常调用.slice()时,底层发生的事情是,这是一个数组,然后它只是迭代该数组,并完成它的工作。
这是如何在.slice()函数数组?因为当你这样做的时候:
object.method();
...对象自动成为this在方法()中的值。所以有:
[1,2,3].slice()
...数组[1,2,3]被设置为.slice()中的this值。
但是如果你可以用别的东西代替这个值呢?只要你替换的东西有一个数值的。length属性,还有一堆数值索引的属性,它就可以工作。这种类型的对象通常称为类数组对象。
.call()和.apply()方法允许您在函数中手动设置this的值。因此,如果我们在.slice()中将this的值设置为一个类似数组的对象,.slice()将假设它正在处理一个数组,并将执行它的任务。
以这个普通对象为例。
var my_object = {
'0': 'zero',
'1': 'one',
'2': 'two',
'3': 'three',
'4': 'four',
length: 5
};
这显然不是一个数组,但如果你可以将它设置为.slice()的This值,那么它就会工作,因为它看起来足够像一个数组,让.slice()正常工作。
var sliced = Array.prototype.slice.call( my_object, 3 );
例如:http://jsfiddle.net/wSvkv/
正如你在控制台看到的,结果是我们所期望的:
['three','four'];
这就是当你将参数对象设置为.slice()的this值时所发生的情况。因为参数有一个.length属性和一堆数值索引,.slice()就像在一个真正的数组上工作一样。
其他回答
假设你有:function。apply(thisArg, argArray)
apply方法调用一个函数,传入将绑定到this的对象 和一个可选的参数数组。
slice()方法选择数组的一部分,并返回新数组。
当你调用array。prototype。slice。Apply (arguments,[0])在参数上调用数组切片方法(bind)。
正如MDN所指出的,这是因为
arguments对象不是数组。它类似于数组,但是 除了长度以外,没有任何数组属性。例如,它确实如此 没有pop方法。然而,它可以转换为一个真正的数组:
这里我们是在原生对象Array上调用slice,而不是在它的实现上调用slice,这就是为什么要使用额外的.prototype
var args = Array.prototype.slice.call(arguments);
/*
arguments: get all args data include Length .
slice : clone Array
call: Convert Object which include Length to Array
Array.prototype.slice.call(arguments):
1. Convert arguments to Array
2. Clone Array arguments
*/
//normal
function abc1(a,b,c){
console.log(a);
}
//argument
function: function abc2(){
console.log(Array.prototype.slice.call(arguments,0,1))
}
abc1('a','b','c');
//a
abc2('a','b','c');
//a
通常,调用
var b = a.slice();
将数组a复制到b中。然而,我们不能
var a = arguments.slice();
因为参数没有slice作为方法(它不是一个真正的数组)。
Array.prototype.slice是数组的slice函数。.call运行这个slice函数,并将this值设置为参数。
也许有点晚了,但所有这些混乱的答案是,在JS中使用call()进行继承。 如果我们将其与Python或PHP进行比较,例如,调用分别用作super().init()或parent::_construct()。
这是它的用法的一个例子,阐明了所有:
function Teacher(first, last, age, gender, interests, subject) {
Person.call(this, first, last, age, gender, interests);
this.subject = subject;
}
参考:https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Objects/Inheritance