我在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)?
不是bug。这就是Array构造函数的工作方式。
争取民主变革运动:
当您使用Array构造函数指定单个数值形参时,您将指定数组的初始长度。下面的代码创建了一个包含五个元素的数组:
var billingMethod = new Array(5);
Array构造函数的行为取决于单个参数是否为数字。
.map()方法只在数组的迭代元素中包含显式赋值的元素。即使显式赋值为undefined也会导致一个值被认为符合迭代包含的条件。这看起来很奇怪,但它本质上是对象上显式的未定义属性和缺少属性之间的区别:
var x = { }, y = { z: undefined };
if (x.z === y.z) // true
对象x没有名为“z”的属性,而对象y有。然而,在这两种情况下,属性的“值”似乎都是未定义的。在数组中,情况与此类似:length的值隐式地对从0到length - 1的所有元素进行赋值。因此,在使用array构造函数和数值参数新构造的数组上调用.map()函数时,不会执行任何操作(不会调用回调)。
我认为最好的解释方式是看看Chrome处理它的方式。
>>> x = new Array(3)
[]
>>> x.length
3
因此,实际发生的情况是new Array()返回一个长度为3的空数组,但没有值。因此,当您在技术上为空的数组上运行x.map时,不需要设置任何内容。
Firefox只是用undefined“填充”这些空槽,即使它没有值。
我不认为这是一个明显的错误,只是一种表现正在发生的事情的糟糕方式。我想Chrome的是“更正确”,因为它显示数组中实际上没有任何东西。
既然问题是为什么,这与JS的设计方式有关。
我认为有两个主要原因可以解释这种行为:
性能:给定x = 10000和新Array(x),构造函数最好避免从0到10000循环填充未定义值的数组。
隐式"undefined":给定a = [undefined, undefined]和b = new Array(2), a[1]和b[1]都将返回undefined,但a[8]和b[8]即使超出范围也将返回undefined。
最终,符号empty x3是避免设置和显示一长串未定义值的快捷方式,因为它们没有显式声明。
注意:给定数组a =[0]和[9]= 9,console.log(a)将返回(10)[0,empty x 8,9],通过返回显式声明的两个值之间的差值自动填充空白。