apply
将上下文作为第一个参数,将类似数组的参数列表作为第二个参数。然后它调用函数(Array
) 以可迭代作为参数。
Array.apply(null, [1, 2])
// Same as
Array(1, 2)
// Or
[1, 2]
现在,如果您将对象作为数组传递,它仍然会像这样迭代它:
function apply(context, args) {
for(var i = 0; i < args.length; i++) {
/*...*/ args[i];
}
}
所以如果你通过了{ length: 4 }
它将迭代四次并花费undefined
作为一个参数,所以它的结果是这样的:
Array.apply(null, { length: 4 })
// Same as
Array(undefined, undefined, undefined)
因此,数组槽不为空,但它们是未定义的,并且如下map
仅跳过空槽,它将遍历第二个数组的每个条目。
顺便说一句,同样可以实现更具可读性:
Array.from({length: 4 }, (_, i) => i)
// [0, 1, 2, 3]