Javascript:“new Array(4)”与 Array.apply(null, {length: 4}) 有何不同?

Mik*_*keB 4 javascript arrays

我想生成一个给定长度的空数组并用一些数字填充它。生成具有四个连续数字元素的数组的一种方法是:

var x = Array.apply(null, {length: 4}).map(function(item, index){return index;})
Run Code Online (Sandbox Code Playgroud)

但当我看到时,Array.apply(null, {length: 4})我想我可以用它来代替它new Array(4),但事实并非如此。进行快速测试会产生以下结果:

>> console.log((new Array(4)))
<< [ <4 empty items> ]

>> console.log(Array.apply(null, {length: 4}))
<< [ undefined, undefined, undefined, undefined ]
Run Code Online (Sandbox Code Playgroud)

这意味着我可以.map后者但不能前者。

new Array那么Array.apply(null, {})我认为创建具有给定长度的数组对象之间有什么区别?

Jon*_*lms 7

apply将上下文作为第一个参数,将类似数组的参数列表作为第二个参数。Array然后它以可迭代对象作为参数调用函数 ( )。

Array.apply(null, [1, 2])
// Same as
Array(1, 2)
// Or
[1, 2]
Run Code Online (Sandbox Code Playgroud)

现在,如果您将对象作为数组传递,它仍然会像这样迭代它:

function apply(context, args) {
  for(var i = 0; i < args.length; i++) { 
    /*...*/ args[i];
  }
}
Run Code Online (Sandbox Code Playgroud)

因此,如果您通过,{ length: 4 }它将迭代四次并作为undefined参数,因此结果如下:

Array.apply(null, { length: 4 })
// Same as
Array(undefined, undefined, undefined)
Run Code Online (Sandbox Code Playgroud)

因此,数组槽不为空,但它们是未定义的,并且由于map仅跳过空槽,因此它将遍历第二个数组的每个条目。

顺便说一句,同样可以实现更具可读性:

Array.from({length: 4 }, (_, i) => i)
// [0, 1, 2, 3]
Run Code Online (Sandbox Code Playgroud)