Array.map似乎不适用于未初始化的数组

Raj*_*aja 18 javascript arrays

我正在尝试使用map函数在未初始化的数组上设置默认值,但它似乎不起作用,有关如何设置默认值的任何想法?

请考虑我在Chrome控制台中尝试过的代码段.

> var N = 10;
> var x = new Array(N);
> x
  [undefined x 10]

> x.map(function(i) { return 0;});
  [undefined x 10]
Run Code Online (Sandbox Code Playgroud)

我期待数组被初始化为0.

mač*_*ček 26

如果你想填充一个数组,你可以使用Array(5).fill(),然后这些方法将按预期工作 - 请参阅aasha7的备用相关答案.较早的预填方法包括:

Array.apply(null, new Array(5)).map(function() { return 0; });
// [ 0, 0, 0, 0, 0 ]
Run Code Online (Sandbox Code Playgroud)

在阅读了评论中链接一篇帖子之后,我发现这也可以写成

Array.apply(null, {length: 5}).map(function() { return 0; });
Run Code Online (Sandbox Code Playgroud)

但是,尝试使用.map未定义的值将无法正常工作.

x = new Array(10);
x.map(function() { console.log("hello"); });

// so sad, no "hello"
// [ , , , , , , , , ,  ]
Run Code Online (Sandbox Code Playgroud)

.map 将跳过未定义的值:(

  • +1; 这里的问题是`map`跳过从未赋值的*索引*.将`Object.keys(new Array(2))`(无可枚举的属性)与`Object.keys([undefined,undefined])`(两个可枚举的属性,`0`和`1`)进行比较.在第一种情况下,数组没有赋值给任何索引; 在第二种情况下,索引"0"和"1"已被赋值为"undefined". (3认同)

aas*_*ah7 7

我只想指出你现在可以这样做:

Array(2).fill().map(_ => 4);
Run Code Online (Sandbox Code Playgroud)

这将返回[4, 4].

  • 甚至更短的`Array(10).fill(0)` (2认同)