我在 JS 中看到 四个 五个将数组初始化为特定长度的选项,(我知道最后一个是拉伸(stretch)):
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)。就最终结果而言,第一个示例是否等同于第二个示例?我意识到这在执行上是不等价的。
最佳答案
前两个和第三个例子是等价的,最后它们产生了一个Array
。只有一个自己的属性的对象,length
, 包含 5
作为它的值(value)。
当您调用 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
的构造函数运算符,在第二个例子中你是 calling the Array
constructor as a function .
最后,关于你的 makeArrayToLength
函数,现在我想你知道它根本不等价,因为所有“索引属性”都被初始化为“默认”值。 (顺便说一句,不要使用 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
构造函数可以被覆盖,而数组文字将始终有效。
关于javascript - Array(5) 是否等同于 var a = []; a.长度=5;在 JS 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4395429/