我看到四个五个选项,用于在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)。第一个例子在最终结果方面是否等同于第二个例子?我意识到它在执行中并不等同。
答案 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,但重复多次直到最大索引。