最近在看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之间的区别

解决方案 »

  1.   

    呵呵,骂得好。NND此undefined非彼undefined照我看嘛:
    第一个返回false,是因为数组中没有元素
    第二个返回true,是因为数组中指定数组下标有值,所以返回true。相当于判断arr2[0]有没有值了var arr2 = [undefined,,,];
    console.log(1 in arr2);  //照样是false
      

  2.   

    英文原版里面只有楼主说的这段代码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