【问题标题】:In JavaScript, why is [ ] preferred over new Array();?在 JavaScript 中,为什么 [ ] 优于 new Array();?
【发布时间】:2010-12-20 12:17:17
【问题描述】:

我记得在某处(我认为是在 Crockford 的一篇论文中)读到使用数组文字 [] 比使用 new Array(); 表示法更好。

但我真的不记得其中一个比另一个有什么优势。

谁能解释一下为什么前者比后者更受欢迎?

这是我能想到的为什么[]new Array(); 更好的原因之一:

var Array = function () { };

覆盖Array 对象会破坏代码...!

还有什么原因吗?

【问题讨论】:

  • 当然覆盖数组对象会破坏代码。如果你射中自己的脚,你也可能无法再走路了。
  • 呵呵,我知道我知道...但是如果某些(愚蠢的)库或者某些愚蠢的插件覆盖了它呢?

标签: javascript arrays literals


【解决方案1】:

简洁

通过网络传输的字节更少,解释的字节更少,解析它的脑力资源也更少。

少即是多。

一致性

这两行代码有什么区别?

var arr = [5];
var arr = new Array(5);

根据herenew Array(5); 不会返回一个包含 5 的数组,而是返回一个 5 元素数组,所有元素都是 undefined。而这两行返回相同的数组。

var arr = [5,6];
var arr = new Array(5,6);

【讨论】:

  • 呃,构造函数的东西太糟糕了。以前从未注意到这一点。
  • Avoid new Array() 请参考避免新的 Array() 部分,这证实了 barkmadley 的帖子
【解决方案2】:

一个很好的理由是因为 Array 构造函数具有完全不直观的行为。例如:

var a = new Array(5);
console.log(a.length); //prints "5"
console.log(a[0]); //prints "undefined"

var b = new Array(1,2);
console.log(b.length); //prints "2"
console.log(b[0]); //prints "1"

在这种情况下,a 最终成为一个大小为 5 且所有元素未定义的数组,而 b 最终成为一个大小为 2 的数组,其值为 [1,2]。

var c = new Array("5");
console.log(c.length); //prints "1"
console.log(c[0]); //prints "5"

在这里,您最终得到一个包含“5”的单元素数组

一般来说,您应该从不在 Javascript 的内置类型上使用构造函数。他们都有像这样奇怪的边缘情况。例如:

var s = new String("Hello");
var l = "Hello";
console.log(typeof(s)); // prints "object"
console.log(typeof(l)); // prints "string"

【讨论】:

    【解决方案3】:

    优雅

    简而言之,它只是看起来更好,并且程序员更容易解析,尤其是对于更复杂的数据结构:

    var a = [
        ['a list', 'of', 'strings'],
        [1, 2, 3, 4],
        { hello: "This is an object property." }
    ];
    

    与笨拙的面向 OOP 的方法相比:

    var a = new Array();
    var a2 = new Array();
    
    a2.push('a list');
    a2.push('of');
    a2.push('strings');
    
    var a3 = new Array();
    a3.push(1);
    a3.push(2);
    a3.push(3);
    a3.push(4);
    
    var o = new Object();
    o.hello = "This is an object property";
    a.push(a2, a3, o);
    

    【讨论】:

    • 很好的答案... JSON 表示法比以编程方式执行要优雅得多。
    • 只是为了迂腐——他使用的是对象/数组文字,而不是 JSON。 JSON 是为数据交换而设计的扩展概念,其规则集略有不同(它受到更多限制,标识符应括在引号中)
    【解决方案4】:

    new Array(1, 2, 3) 代替 [1, 2, 3]new String("cow") 代替 "cow" 相同

    【讨论】:

    • 真的取决于运行时... new String("cow") 被装箱,因此表现得像一个普通的对象,而在一些 js 实现中“cow”没有(你可以分配动态属性到第一个,但第二个只有它的原型的属性)...... Number 和 Boolean 的相同......
    • new String 返回一个 String 类的新对象,这是一个非常重要的区别:严格相等会失败,空字符串->false 转换不会发生,您可以将属性附加到对象(你不能用字符串)。而且我相信在所有快速的 JS 引擎中,它最终也会使用起来非常缓慢。
    • 我认为这对任何人来说都不是有用的评论。字符串是一种值类型,并且 new String("cow") 而不是 "c​​ow" 有区别,例如String("cow") === "cow" //假
    猜你喜欢
    • 1970-01-01
    • 2015-08-14
    • 2019-04-16
    • 2011-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-14
    • 2012-06-09
    相关资源
    最近更新 更多