Array(2)和[undefined,undefined]之间有什么区别?

时间:2013-02-13 14:24:49

标签: javascript arrays

[undefined, undefined, undefined].map(function(val, i) { return i });

返回[0,1,2],而

Array(3).map(function(val, i) { return i });

返回[undefined,undefined,undefined]。

为什么?

5 个答案:

答案 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()函数不返回值;

  • test()你有一个包含3个值(未定义)的对象
  • test2()有一个长度为3的空数组