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

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).第一个例子在最终结果方面是否等同于第二个例子?我意识到它在执行中并不等同.

CMS*_*CMS 9

前两个,和第三实施例是等效的,在端部它们产生一个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构造函数可以被覆盖,而数组文字将始终工作.