[英]Why is Object.keys([,1,,1]) different from Object.keys([,1,undefined,1])?
我感到震惊的结果
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])会返回不同的结果?
在Object.keys([, 1, undefined, 1])
情况下,您显式定义了第三个undefined
元素,但在Object.keys([, 1, , 1])
,没有与索引关联的元素2
。 因此, 2
在第一种情况下被识别为数组索引,但在第二种情况下不被识别。
只是为了表示数组中的孔,当您实际引用它时,将返回undefined
。 这就是为什么[, 1, , 1][2]
undefined
。
这是Javascript数组要小心的一个警告:你可以拥有稀疏数组 , 缺少值的数组,这与具有undefined
值的数据不同 (数组元素存在,就像可以声明变量一样,但是它的值是'undefined' )。
请注意,您可以使用数组元素上的delete
获得相同的行为。
如前所述,您可以使用=== undefined
测试空值,这更令人困惑,因为它通常不会导致相同的输出。
你认为它没有多大意义是对的。 它没有。 基本上,在javascript中,“undefined”和“从未定义”之间有时会有区别。 在第一个示例中,您没有给第二个索引任何值,因此它不会打印。 在第二个例子中,你给它一个值(即使该值未定义,它仍然得到一个值)所以它打印它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.