为什么 Object.keys([,1,,1]) 和 Object.keys([,1,undefined,1]) 不同?

3
我感到震惊的是,

...

的结果。

document.writeln(Object.keys([,1,,1]));

1,3

这是一个自动过滤掉数组中不包含任何内容的索引的函数。但是当我尝试打印出Object.keys([,1,undefined,1]):

document.writeln(Object.keys([,1,undefined,1]));

结果如下:

1,2,3

这与之前的不同,我在第一个中尝试打印索引2的值:

document.writeln([,1,,1][2]);

实际上是未定义的。为什么Object.keys([,1,,1])和Object.keys([,1,undefined,1])返回不同的结果?


如果你使用 console.log 打印这两个数组,你会注意到它们之间的差异。第一个数组显示 <1 empty slot>,而第二个数组则显示 undefined。这个数组被设计成在你尝试访问一个空槽时返回 undefined,但那不是它里面的值。 - Kaddath
3个回答

3
Object.keys([, 1, undefined, 1])的情况下,您显式地定义第三个元素为undefined,但在Object.keys([, 1, , 1])中,没有与索引2相关联的元素。所以,在第一种情况下,2被识别为数组索引,而在第二种情况下则不是。
只需要表示数组中的空洞,当实际引用它时,将返回undefined。 这就是为什么[, 1, , 1][2]undefined的原因。

0

在使用JavaScript数组时需要小心的一点是:你可能会遇到稀疏数组,即具有缺失值的数组,这与具有undefined(数组元素存在,就像可以声明变量一样,但其值为`undefined`)不同。

请注意,您可以使用delete操作符删除数组元素来获得相同的行为。

如前所述,您可以使用=== undefined测试空值,这更令人困惑,因为它通常不会导致相同的输出结果。


0

你认为这没有多少意义是正确的。确实如此。基本上,在JavaScript中,“未定义”和“从未定义”之间有时存在差异。在第一个示例中,您没有给第二个索引任何值,因此它不会打印。在第二个示例中,您正在给它一个值(即使该值未定义,它仍然获得了一个值),因此它会打印出来。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接