Array(5)等效于var a = []; a.length = 5;在JS?

时间:2010-12-09 06:18:25

标签: javascript arrays constructor literals

我看到四个五个选项,用于在JS中将数组初始化为特定长度,(最后一个是拉伸,我知道):

var a = []; a.length = 5;

var a = Array(5);

var a = []; a[4] = undefined;

var a = new Array(5);

function makeArrayToLength(length, default){
    var a = [], i = 0;
    for(; i < length; i++){
        a[i] = default;
    }
    return a;
}

我绝对希望(并且确实)尽可能使用文字,但我处于特定数组的定义方面是它的长度的情况,所以我倾向于Array(5)。第一个例子在最终结果方面是否等同于第二个例子?我意识到它在执行中并不等同。

2 个答案:

答案 0 :(得分:9)

前两个和第三个示例是等效的,最后它们生成一个Array对象,只有一个拥有属性length,包含5作为它的价值。

当您使用单个数字参数(如Array)调用Array(5);构造函数时,新创建的对象将包含该数字作为其length属性,索引属性未创建:

var a = Array(5);
a.hasOwnProperty('0'); // false

第二个例子产生的相同:

var a = [];
a.length = 5;
a.hasOwnProperty('0'); // false

关于第三个例子,它不是等价的,因为它会在数组对象上创建一个属性,即使它的值是undefined

var a = []; a[4] = undefined;
a.hasOwnProperty('4'); // true

第四个例子:

var a = new Array(5);

与第二个(var a = Array(5);)完全相同,使用Array构造函数与new运算符之间没有区别,在第二个示例中,您是{ {3}}

最后,关于你的makeArrayToLength函数,到目前为止我认为你知道它根本不相同,因为所有的“索引属性”都被初始化为“默认”值。 (BTW不要使用default作为标识符,它是关键字......)

Array构造函数通常被避免,因为根据使用的参数,它可能有不同的行为,例如:

Array("5"); // one element array, (["5"])
Array(5);   // empty array, length = 5
// v.s.
["5"]       // one element array
[5]         // one element array

此外,Array构造函数可以被覆盖,而数组文字将始终有效。

答案 1 :(得分:2)

是的,它们都会产生相同的结果。

2和4是相同的,因为根据ECMAScript spec

  

15.4.1当Array作为a调用时,作为函数调用的数组构造函数   函数而不是构造函数,   它创建并初始化一个新数组   宾语。因此函数调用   数组(...)等同于对象   创建表达式新数组(...)   用相同的论点。

1和2是等效的,因为[]构造了一个新数组,并且设置length属性相当于使用new Array(length)in the spec)构建数组。

选项3也是等效的,因为:

  

...每当添加名称为数组索引的属性时,如果需要,将更改length属性,使其大于该数组索引的数值

选项5基本上只是选项3,但重复多次直到最大索引。