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

时间:2018-01-16 08:27:44

标签: javascript arrays

我很震惊

的结果



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])会返回不同的结果?

3 个答案:

答案 0 :(得分:3)

Object.keys([, 1, undefined, 1])案例中,您明确将第三个元素定义为undefined,但在Object.keys([, 1, , 1])中,没有与索引2相关联的元素。因此,2在第一种情况下被识别为数组索引,但在第二种情况下则不被识别。

只是为了表示数组中的孔,当您实际引用它时,将返回undefined。这就是为什么[, 1, , 1][2]undefined

答案 1 :(得分:0)

对于Javascript数组,请注意以下几点:您可以使用稀疏数组缺少值的数组,这与{{1}不同} values (数组元素存在,就像可以声明变量一样,但它的值是'未定义的)。

请注意,您可以在数组元素上使用undefined获得相同的行为。

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

答案 2 :(得分:0)

你认为它没有多大意义是正确的。它没有。基本上,在javascript中有有时" undefined"之间的区别。和"从未被定义过"。在第一个示例中,您没有给第二个索引任何值,因此它不会打印。在第二个示例中,您为其提供了一个值(即使该值未定义,它仍然 值),因此它会打印它。