这个Array.apply方法是如何工作的?

3

我知道你可以将数组传递给Function.prototype.apply,但最近我遇到了这段代码(它被写成一种创建由undefined值而不是空槽或洞的数组的好方法);

var a = Array.apply( null, { length: 3 } );

我不理解这段代码从第二个参数开始是如何工作的。是否有其他语法可以用来更清楚地说明正在发生的事情?当我们将实际对象传递给 apply 时,发生了什么?我们能否将此对象转换为数组以获得此结果?我尝试了许多方法来做到这一点,但没有成功。


3
new Array(3) 是一样的。 - Akxe
1
不是的,不完全是。 - Jaromanda X
@JaromandaX:http://ecma262-5.com/ELS5_HTML.htm#Section_15.4.1 - Microfed
@Microfed - 为什么针对我说这句话? - Jaromanda X
@JaromandaX:因为它说Array()和new Array()返回相同的结果。 :) - Microfed
显示剩余5条评论
2个回答

3

哦,那太糟糕了。

当你将Array作为函数调用时,它并不关心this是什么,所以你可以告诉它thisnull

apply的第二个参数是一个类似数组的对象,它给出了参数列表。

如果你有[0, 0, 0],那就像这个对象:

{
    0: 0,
    1: 0,
    2: 0,
    length: 3
}

因为数组具有长度属性,该属性等于其最高索引的值。真正的数组还会从原型中获取其他属性,但我们(以及apply和Array)不关心这些属性。
您传递给Array的参数将成为其初始值。
现在,似乎(在内部),Array检查其参数的长度,然后使用类似以下内容设置其内部值:
for (var i = 0; i < arguments.length; i++) {
    internal_array_values.push(arguments[0])
}

如果您有一个对象,它仅由{ length: 3 }组成,则每个这三个参数的值都将变为undefined,从而得到[undefined, undefined, undefined]


apple -> 苹果 - Microfed

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接