在数组中迭代未定义的方法

May*_*nty 5 javascript arrays

我最近发现,.map没有迭代由带孔数组创建的未定义,数组的各个索引已定义,但有些不是:

// Holed
var array = [];
array[0] = 1;
array[2] = 3;
array // => [1, undefined, 3];

// Not Holed
var array = [1, undefined, 3];
array // => [1, undefined, 3]; The "same" as Holed
Run Code Online (Sandbox Code Playgroud)

当涉及到迭代时,这两个应该相同的数组,以不同的方式定义,以不同的方式迭代(参见第一个发送)

这是我的问题,

  1. 有没有办法迭代有孔阵列?
  2. 我怀疑这些确切的字节实际上是不同的,而这种奇怪的行为是由于JavaScript的如何显示其没有定义,没有这些值undefined.我对么?对这种异常有任何潜在的解释吗?

非常欢迎任何帮助.谢谢!

zer*_*kms 3

有什么方法可以迭代有孔数组吗?

大多数(全部?)内置Array.prototype函数都会跳过稀疏数组中的漏洞。

这意味着如果您想获取undefined缺失索引的值 - 您需要首先将该数组转换为非稀疏数组。

在 ES2015 的帮助下,您可以使用数组迭代器。最短的方法是使用数组扩展语法:

[...array]
Run Code Online (Sandbox Code Playgroud)

然后你可以对其应用映射运算符[...array].map(handler)

我怀疑这些确切的字节实际上是不同的,这种奇怪的行为是由于 JavaScript 如何显示这些未定义的值,而不是未定义的值。我对么?这种异常现象有什么根本的解释吗?

你是对的,它不包含undefined明确地保存这些值。由于 JS 中的数组实际上是所谓的“内在对象”(或更短 - 对象),因此它们的索引只是这些对象的属性。因此,当您跳过索引时 - 该属性根本没有设置并且不存在。

这与访问不存在的对象属性相同:

var o = {};
o.foo // undefined
Run Code Online (Sandbox Code Playgroud)