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

时间:2018-06-21 17:34:52

标签: javascript arrays

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

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 Array

Array.apply(null, {})#include <stdio.h> int *ARRAY_OF_VARIABLES[1]; int initalizeVariables() { int i = 0; ARRAY_OF_VARIABLES[0] = &i; return i; } int main(void) { int test = initalizeVariables(); test = 1; printf ("Test: %d, ARRAY_OF_VARIABLES[0]: %d\r\n", test, (int)*ARRAY_OF_VARIABLES[0]); } 之间的区别是什么?我以为都是创建给定长度的数组对象?

3 个答案:

答案 0 :(得分:4)

apply将上下文作为第一个参数,并将数组状的参数列表作为第二个参数。然后,它以iterable作为参数调用函数(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]

答案 1 :(得分:3)

答案需要深入研究Array对象的机制。

new Array(4)创建一个长度为4但没有项目的数组(稀疏数组)

Array.apply(null, {length: 4})创建一个包含4个未定义元素的数组。

第二个使用一些技巧:

  1. apply调用具有给定上下文和数组中提供的参数的函数。

  2. Array,当直接作为函数调用时,会根据作为参数获得的元素创建一个数组,例如:

    \> Array(1,2,3) [ 1, 2, 3 ] \> Array(...[1,2,3]) [ 1, 2, 3 ] \> Array(...new Array(4)) [ undefined, undefined, undefined, undefined ]

那么Array.apply(null, {length: 4})为何等同于Array.apply(null, new Array(4)

apply通过查看长度然后获取相关参数来解析参数数组。 {length: 4}.length是4,所以需要

{length:4}[0]
{length:4}[1]
{length:4}[2]
{length:4}[3]

全部为undefined

答案 2 :(得分:0)

不同之处在于 new Array(4)不会初始化阵列中的插槽。它仅设置数组的length属性。 Array.apply(null, {length: 4})将每个插槽初始化为undefined。