And*_*rew 11 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;
}
Run Code Online (Sandbox Code Playgroud)
我绝对希望(并且确实)尽可能地使用文字,但我处于特定数组的定义方面是它的长度的情况,所以我倾向于Array(5).第一个例子在最终结果方面是否等同于第二个例子?我意识到它在执行中并不等同.
前两个,和第三实施例是等效的,在端部它们产生一个Array对象只用一个自己的属性,length含有5作为它的值.
当调用Array使用单个数字参数(如构造函数Array(5);),新创建的对象将包含数字作为它的length属性时,索引属性不创建:
var a = Array(5);
a.hasOwnProperty('0'); // false
Run Code Online (Sandbox Code Playgroud)
第二个例子产生了同样的结果:
var a = [];
a.length = 5;
a.hasOwnProperty('0'); // false
Run Code Online (Sandbox Code Playgroud)
关于第三个例子,它不是等价的,因为它将在数组对象上创建一个属性,即使它的值是undefined:
var a = []; a[4] = undefined;
a.hasOwnProperty('4'); // true
Run Code Online (Sandbox Code Playgroud)
第四个例子:
var a = new Array(5);
Run Code Online (Sandbox Code Playgroud)
仅仅是完全一样的第二个(var a = Array(5);),有使用没有任何区别Array构造带或不带new操作员,在第二个例子中你调用Array构造函数的函数.
最后,关于你的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
Run Code Online (Sandbox Code Playgroud)
此外,Array构造函数可以被覆盖,而数组文字将始终工作.