[undefined, undefined, undefined].map(function(val, i) { return i });
返回 [0, 1, 2],而
Array(3).map(function(val, i) { return i });
返回值为[undefined, undefined, undefined]。
为什么?
[undefined, undefined, undefined].map(function(val, i) { return i });
返回 [0, 1, 2],而
Array(3).map(function(val, i) { return i });
返回值为[undefined, undefined, undefined]。
为什么?
undefined
值定义和初始化了一个新数组,而在第二种情况下,你仅仅定义了一个可能长度为3的数组。
new Array(3)
与你如下操作相同:
var arr = [];
arr.length = 3;
因此,由于.length
属性被隐式定义,.map()
方法可以对分配在内存中的数组进行迭代,该数组基本上不包含任何定义的项(即纯粹为空)。
undefined
。因此,[undefined]
创建一个指向未定义的指针数组。new Array(3)
创建了一个由未定义指针组成的数组,这些指针不会被数组原型方法(包括.map
)循环遍历。MDN参考文献。变量undefined
实际上分配了一个值,即使它指向undefined
。
Array(3)
只是使用空数组手动指定长度:
> a = []
[]
> a.length = 3
3
> a
[ , , ]
> a = [undefined, undefined, undefined]
[ undefined, undefined, undefined ]
如果只传递给Array构造函数一个介于0和232-1(含)之间的整数,将创建一个新的空JavaScript数组,并将其长度设置为该数字。如果参数是任何其他数字,则会抛出RangeError异常。
因此,数组被初始化为空数组[]
。这就解释了为什么map
不处理任何数组元素,因为没有元素。
Array(3)
初始化数组时,它是空的,因此map
没有要迭代的内容:> Array(3)
.map(function(val, i) { console.log(i); return i; });
[ , , ]
> [undefined, undefined, undefined]
.map(function(val, i) { console.log(i); return i; });
0
1
2
[ 0, 1, 2 ]
正如@VisioN所提到的,Array(3)是已定义但未初始化的。有趣的是,你可以通过Array.apply传递未初始化的数组,并对其进行初始化。我曾经使用这种方法来填充数组:
Array.apply(null, Array(3)).map(function(val,i) { return i; });
// [0, 1, 2]
<script type="text/javascript">
test();
test2();
function test() {
[undefined, undefined, undefined].map(function(val, i) { console.log("un: " + val + "/" + i); return i; });
}
function test2() {
Array(3).map(function(val, i) { console.log("no: " + val + "/" + i); return i; });
}
</script>
test()函数返回:
un: undefined/0 un: undefined/1 un: undefined/2
test2()函数不返回任何值;
undefined
的引用,因为全局对象的undefined
属性最初设置为值undefined
,因此引用到undefined
,而Array(1)
具有未定义的引用。这将评估为相同的值undefined
,因此Array(1)[0] === [undefined][0] //true
就像var undefined2;new Array(1)[0] === [undefined2][0]
,其中undefined2
包含对值undefined
的引用。 - Moritz Roessler