【问题标题】:Why use {} instead of new Object() and use [] instead of new Array() and true/false instead of new Boolean()?为什么使用 {} 而不是 new Object() 并使用 [] 而不是 new Array() 和 true/false 而不是 new Boolean()?
【发布时间】:2016-02-01 03:18:00
【问题描述】:

很多人说你应该避免使用 new Object、new Array() 而是使用 {}。 [] 和真/假。

使用字面量构造来获取对象或数组的新实例而不是使用 new 有什么好处?我知道 Crockford 不喜欢 new 但这是主要论点吗?

【问题讨论】:

  • new Boolean(true) 不等于 true

标签: javascript


【解决方案1】:

对象和数组字面量相对于使用各自的构造函数的优点是:

  • 更短更易读
  • 更安全:当 ArrayObject 构造函数被覆盖时,文字仍然可以工作
  • 可能更快,但不太可能成为主要考虑因素(几乎可以肯定,任何瓶颈都来自代码中的其他地方)

在数组的情况下,文字还有一个额外的优势:不可能单独使用Array 构造函数来创建具有单个成员的数组。例如,[3] 将创建一个包含一个元素为数字 3 的数组,而new Array(3) 创建一个长度为 3 的数组。

更新:现在问题已被编辑,以下段落不再相关。

关于布尔值,您似乎有一个误解:new Boolean(false)false 不一样。 Boolean() 构造函数创建一个布尔对象,而 falsetrue 是布尔基元。事实上,new Boolean(false) 在例如if 语句中强制转换为布尔值时,其计算结果为true。简而言之,很少有理由使用Boolean() 构造函数。请改用truefalse。类似地,字符串和数字等其他原语具有相应的 String()Number() 构造函数,它们生成的 StringNumber 对象与原始字符串和数字不同,通常应避免使用。

【讨论】:

  • 编辑了原始问题以删除不正确的真/假而不是新的 Boolean() 语句。
  • @Paul:我会把布尔值留在我的回答中:它仍然是有用的信息。
  • 一些有趣的性能说明:在较新的浏览器中使用new Object()new Array() 似乎比使用{}[] 之类的文字声明要快。 (见thisthisthis)。
  • 不使用new Array() 的主要原因之一是传递单个参数时的歧义。您提到的原因是有效的,但不是主要问题
  • @JuanMendes 你能用一个例子解释你的评论吗?
【解决方案2】:

例如,如果你想这样做:

{name:"bla",address:"address"}

新的 Object() 方法是:

var o = new Object();
o.name="bla";
o.address="address";

第一个要短得多。而且我认为它在许多浏览器中也会更快(jsperf testcase)。

【讨论】:

  • 更快,是的。几年前,我尝试了 new Array() 方法,然后用 arr.push() 添加了所有值 - 有数千个值要添加(我没有生命 =_= )而且它很慢......软糖。只需将所有值放入数组构造函数 new Array(val1,val2,val3...) 就快得多了!
  • @Kolink - 这可能是因为你打电话给.push()。这里的问题更多是关于构造函数new Array(val1,val2,val3...) 与文字[val1,val2,val3...]
  • new Object()new Array() 当您需要构建大量它们然后经常设置/附加数据时要快得多。在解析器/解码器中,使用它们会显着提高速度。
【解决方案3】:

我认为主要是为了简洁。

当你可以写[]时为什么写new Array(),或者当你可以写{}时写new Object()

另外new Boolean() 完全是多余的。布尔值总是需要为真或假,因此您绝对应该为此使用内置常量。

【讨论】:

  • new Boolean(true) 比冗余更糟糕,它与原始 true 不同。看我的回答。
【解决方案4】:

在大多数情况下,object literal 或数组字面量就足够且更易于使用。你甚至可以调用或应用原型方法(例如 [].prototype.slice.call(someObj))它也大多是 faster。 您可能需要注意 {} 和 [] 的构造函数不能被覆盖,并且 ObjectArray 是构造函数,其中 {} 和 [] 是实例。

【讨论】:

  • 我已经运行了您链接到的 jsperf 测试,并且文字是三个中最慢的(在我的机器上)。我猜这取决于 Firefox 3.6.12
  • 我在 Chrome 中运行测试,使用文字更快。如果您在 jsperf 页面上向下滚动,“browserscope”会有一些额外的结果
【解决方案5】:

尚未提及的一个原因是在将参数传递给 Array 构造函数时存在歧义。这都是特定的行为,只是古怪。

new Array(1,2,3); // [1,2,3], that's OK
new Array(1); // [undefined], some may expect to get [1] instead

使用给定元素初始化 JavaScript 数组,除非将单个参数传递给 Array 构造函数并且该参数是数字。 (见下文。)请注意,这种特殊情况仅适用于使用 Array 构造函数创建的 JavaScript 数组,而不适用于使用括号语法创建的数组文字。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array#Syntax

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-17
    • 1970-01-01
    • 2018-10-31
    • 2019-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多