[undefined, undefined, undefined].map(function(val, i) { return i });
返回[0,1,2],而
Array(3).map(function(val, i) { return i });
返回[undefined,undefined,undefined]。
为什么?
答案 0 :(得分:13)
在第一种情况下,您定义并 初始化 一个包含三个undefined
值的新数组,而在第二种情况下如果
new Array(3)
和您一样:
var arr = [];
arr.length = 3;
因此,隐式定义了.length
属性,.map()
方法可以对内存中分配的数组进行迭代,基本上保存零定义项(即纯空)。
答案 1 :(得分:4)
您正在声明指向编写undefined
的未定义对象的指针。因此,[undefined]
创建一个指向未定义的指针数组。 new Array(3)
创建一个未定义指针的数组,它们不会被数组原型方法(包括.map
)循环。
MDN Reference。变量undefined
实际上是指定一个值,即使它指向undefined
。
答案 2 :(得分:1)
Array(3)
只需要一个空数组并手动为其指定一个长度:
> a = []
[]
> a.length = 3
3
> a
[ , , ]
这与手动构造包含未定义元素的数组不同:
> a = [undefined, undefined, undefined]
[ undefined, undefined, undefined ]
<小时/> MDN documentation for Array准确地解释了发生了什么:
如果传递给Array构造函数的唯一参数是0到2 32 -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 ]
答案 3 :(得分:1)
如@VisioN所述,数组(3)已定义但未初始化。有趣的是,您可以通过Array.apply传递未初始化的数组,并初始化它。我用它来填充数组:
Array.apply(null, Array(3)).map(function(val,i) { return i; });
// [0, 1, 2]
答案 4 :(得分:0)
<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()函数不返回值;