一尘不染

Array.prototype.slice.call()如何工作?

javascript

我知道它用于使参数成为真实的数组,但是我不明白使用时会发生什么 Array.prototype.slice.call(arguments)


阅读 249

收藏
2020-04-25

共1个答案

一尘不染

在幕后发生的事情是,当.slice()通常被调用时,它this是一个数组,然后它仅在该数组上进行迭代并完成其工作。

如何this.slice()功能的阵列?因为当您这样做:

object.method();

…该object自动成为价值thismethod()。因此:

[1,2,3].slice()

…将[1,2,3]Array设置为thisin 的值.slice()


但是,如果您可以用其他东西代替this价值呢?只要您替换的内容具有数字.length属性,以及一堆作为数字索引的属性,它就应该起作用。这种类型的对象通常称为类数组对象。

.call().apply()方法让你手动设置的值this的函数。因此,如果我们的值设置this.slice()一个阵列状物体 ,.slice()只会认为它的工作与Array,并会做它的东西。

以这个简单的对象为例。

var my_object = {
    '0': 'zero',
    '1': 'one',
    '2': 'two',
    '3': 'three',
    '4': 'four',
    length: 5
};

显然这不是一个Array,但是如果您可以将其设置为的this.slice(),那么它将正常工作,因为它看起来像Array一样.slice()可以正常工作。

var sliced = Array.prototype.slice.call( my_object, 3 );

如您在控制台中看到的,结果就是我们所期望的:

['three','four'];

因此,当您将arguments对象设置为的this值时,就会发生这种情况.slice()。因为arguments具有一个.length属性和一堆数字索引,所以.slice()就像在真正的数组上工作一样进行工作。

2020-04-25