我在Firefox-3.5.7/Firebug-1.5.3和Firefox-3.6.16/Firebug-1.6.2中观察到这一点
当我启动Firebug时:
var x = new Array(3)
console.log (x)
// [undefined, undefined, undefined]
Var y = [undefined, undefined, undefined]
console.log (y)
// [undefined, undefined, undefined]
Console.log (x.constructor == y.constructor) // true
console.log (
X.map(函数(){返回0;})
)
// [undefined, undefined, undefined]
console.log (
Y.map(函数(){返回0;})
)
// [0,0,0]
这是怎么回事?这是一个错误,还是我误解了如何使用新数组(3)?
数组是不同的。不同之处在于,new Array(3)创建了一个长度为3但没有属性的数组,而[undefined, undefined, undefined]创建了一个长度为3的数组和三个名为“0”、“1”和“2”的属性,每个属性的值都为undefined。你可以用in操作符看出区别:
"0" in new Array(3); // false
"0" in [undefined, undefined, undefined]; // true
这源于一个有点令人困惑的事实,即如果您试图在JavaScript中获取任何原生对象的不存在属性的值,它将返回undefined(而不是抛出错误,当您试图引用不存在的变量时就会发生这种情况),这与之前显式地将属性设置为undefined时得到的结果相同。
数组是不同的。不同之处在于,new Array(3)创建了一个长度为3但没有属性的数组,而[undefined, undefined, undefined]创建了一个长度为3的数组和三个名为“0”、“1”和“2”的属性,每个属性的值都为undefined。你可以用in操作符看出区别:
"0" in new Array(3); // false
"0" in [undefined, undefined, undefined]; // true
这源于一个有点令人困惑的事实,即如果您试图在JavaScript中获取任何原生对象的不存在属性的值,它将返回undefined(而不是抛出错误,当您试图引用不存在的变量时就会发生这种情况),这与之前显式地将属性设置为undefined时得到的结果相同。
我认为最好的解释方式是看看Chrome处理它的方式。
>>> x = new Array(3)
[]
>>> x.length
3
因此,实际发生的情况是new Array()返回一个长度为3的空数组,但没有值。因此,当您在技术上为空的数组上运行x.map时,不需要设置任何内容。
Firefox只是用undefined“填充”这些空槽,即使它没有值。
我不认为这是一个明显的错误,只是一种表现正在发生的事情的糟糕方式。我想Chrome的是“更正确”,因为它显示数组中实际上没有任何东西。