【问题标题】:Is Array(5) equivalent to var a = []; a.length = 5; in JS?Array(5) 是否等同于 var a = []; a.长度 = 5;在 JS 中?
【发布时间】:2010-12-09 06:18:24
【问题描述】:

我看到四个在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)。就最终结果而言,第一个示例是否等同于第二个示例?我意识到它在执行中并不等同。

【问题讨论】:

    标签: javascript arrays constructor literals


    【解决方案1】:

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

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

    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 构造函数可以被覆盖,而数组字面量将始终有效。

    【讨论】:

    • 您知道,如果您要将我的部分答案合并到您的答案中,您可以给我投赞成票。
    • @Hamish,对不起,但我没有在我的“合并你的答案的部分”,我刚刚编辑以扩展我的答案(事实上,直到我完成编辑我才注意到你的答案),这不是第一次I talk about calling built-in constructors as functions :),但是是的,我认为你的回答值得一票...
    • 对不起,如果有误解 - 出于某种原因,我认为您使用了相同的链接,但可能只是误读了。这个答案非常彻底:)
    • @Hamish,谢谢:)。没问题,顺便说一句,如果您有兴趣,有几个 HTML 版本的规范,它们非常有用MallonéeOrendorffSmith
    • @Hamish,哈哈!没有意识到默认是保留的,因为我正在写这个问题。感谢您提供的非常详尽的帖子,很抱歉让您重温本网站上已多次回答的内容(即差异)。在这一点上,你能说在分配类型的情况下哪种初始化方法最好(例如,这个数组需要它的长度为 5,即使是空的)?最好的我想我的意思是六个月后最佳实践和最明确的妥协:)。
    【解决方案2】:

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

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

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

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

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

    ...每当添加名称为数组索引的属性时,如有必要,长度属性会更改为比该数组索引的数值大一

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

    【讨论】:

    • +1,请注意,选项 3 就结果对象而言并非严格等效(即使这对于实际使用),因为显然,在对象中创建了一个名为 '4' 的属性,而其他选项 (1,2,4) 不会发生,结果中唯一的 own property对象为length,未创建“索引属性”...
    猜你喜欢
    • 1970-01-01
    • 2020-05-03
    • 2013-11-16
    • 1970-01-01
    • 1970-01-01
    • 2012-09-24
    • 1970-01-01
    • 1970-01-01
    • 2018-10-28
    相关资源
    最近更新 更多