首页 > 解决方案 > Javascript:'new Array(4)' 与 Array.apply(null, {length: 4}) 有何不同?

问题描述

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

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

但是当我看到时,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 ]

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

那么两者之间有什么区别new ArrayArray.apply(null, {})我认为它们都创建了一个给定长度的数组对象?

标签: javascriptarrays

解决方案


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]

推荐阅读