关于稀疏数组的疑惑

molaifeng
博客专家认证
2012-09-24 10:31:28
最近在看javascript权威指南(第六版),在7.3节中,有下面这段代码

var arr2 = [,,,];
var arr3 = new Array(3);
console.log(0 in arr2); //false ====>书中写的true:0在arr1处有一个元素
console.log(0 in arr3); //false


我在火狐、ie9、chrome中测试了都是false,后来又打印了里面的元素


console.log(arr2); // [undefined,undefined,undefined]
console.log(arr3); // [undefined,undefined,undefined]


上面显示的数组里都是undefined,而当我循环时,却啥都木有

for(var i in arr2) {
console.log(i+'='+arr2[i]) //没有显示
}
for(var i in arr3) {
console.log(i+'='+arr3[i]) //没有显示
}

当我改动一处时,

var arr2 = [undefined,,,];
var arr3 = new Array(3);
console.log(0 in arr2); //true
console.log(0 in arr3); //false


我想问下,这里的undefined之间的区别

...全文
197 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
哈皮玩 2012-11-30
  • 打赏
  • 举报
回复
英文原版里面只有楼主说的这段代码

var a1 = [,,,]; // This array is [undefined, undefined, undefined]
var a2 = new Array(3); // This array has no values at all
0 in a1 // => true: a1 has an element with index 0
0 in a2 // => false: a2 has no element with index 0
这个地方作者描述返回true。我在浏览器中测试的结果和你相同。 但是在中文版本中(淘宝团队翻译)加入了下面的话: “需要注意的是,当省略数组直接量中的值时(使用连续的逗号,比如[1,,3]),这时所得到的数组也是稀疏数组,省略掉的值是不存在的:” 然后给出例子:

var a1 = [,]; // 此数组没有元素,长度是1
var a2 = [undefined]; //……
0 in a1 // => false: a1 在索引0处没有元素
0 in a2 // => true: a2 在索引0处有一个值为undefined的元素
然后还添加了下面这段话: “在一些旧版本的实现中(比如Firefox 3),在存在连续逗号的情况下,插入undefined值的操作则与此不同,在这些实现中,[1,,3]和[1,undefined,3]是一模一样的。” 其实,淘宝团队在翻译时貌似发现原作者给的示例执行可能会是false,所以添加了这段代码以铺垫说明“在旧版版中实现……[1,,3]和[1,undefined,3]是一模一样的”这个特例。 由此,原作者的测试环境是所谓的“旧版本” 我认为两处undefined没有什么区别,都是javascript中的特殊值undefined
泡泡鱼_ 2012-09-24
  • 打赏
  • 举报
回复
呵呵,骂得好。NND

此undefined非彼undefined

照我看嘛:
第一个返回false,是因为数组中没有元素
第二个返回true,是因为数组中指定数组下标有值,所以返回true。相当于判断arr2[0]有没有值了

var arr2 = [undefined,,,];
console.log(1 in arr2); //照样是false
molaifeng 2012-09-24
  • 打赏
  • 举报
回复
你妹啊[Quote=引用 1 楼 的回复:]

痔疮的最佳治疗方法http://www.52jkw.com/
[/Quote]

87,904

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧