js关于稀疏数组的问题

看《javascript权威教程》的时候,关于第七章7.3稀疏数组,有两点不是很明白。

第一

书中的原话是:

注意,当在数组直接量中省略值时不会创建稀疏数组。省略的元素在数组中是存在的,其值为undefined。这和数组元素根本不存在是有一些微妙的区别的。可以用in操作符来检查区别。

接着就是例子:

var a1 = [,,,];//数组是[undefined,undefined,undefined]
var a2 = new Array(3);
0 in a1  //true:a1在索引0处有一个元素。
0 in a2  //false

可是我在编译器里测试的时候,0 in a1输出的是false。

第二

上面例子结束后,书中继续说的问题彻底有点晕了。

需要注意的是,当省略数组直接量中的值时(使用连续的逗号,比如[1,,3]),这时所得到的数组也是稀疏数组,省略掉的值时不存在的。

继续例子:

var a1 = [,];            //此数组没有元素,长度为1
var a2 = [undefined];    //此数组包含一个值为undefined的元素。
0 in a1             //false:a1在索引为0处没有元素。

感觉上下有点冲突的意思,并且第一个例子中我自己验证还和书中的不一样,到底哪里出了问题?求大神解答。
附上图片:

clipboard.png

阅读 3.7k
2 个回答

犀牛书里的确有很多错误,也有可能是因为ES标准以及执行环境等不一样导致的。
实践得真知,建议手动执行

var a1 = [,,]
var a2 = new Array(3)
var a3 = [1,,3]

console.log(0 in a1)
console.log(0 in a2)
console.log(0 in a3)

console.log(1 in a3)

得到结果:

false
false
true
false

所以只要是省略了该位置的元素,用 in 检测都是 false,同时用 for in 也遍历不到。

console.log("a1:")
for (var a in a1){
    console.log(a)
}

console.log("a2:")
for (var a in a2){
    console.log(a)
}

console.log("a3:")
for (var a in a3){
    console.log(a)
}

得到结果:

a1:
a2:
a3:
0
2

原来不只我一个人看不明白这里,这么自相矛盾的话,多谢楼上
image.png

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题