【发布时间】:2016-02-01 03:18:00
【问题描述】:
很多人说你应该避免使用 new Object、new Array() 而是使用 {}。 [] 和真/假。
使用字面量构造来获取对象或数组的新实例而不是使用 new 有什么好处?我知道 Crockford 不喜欢 new 但这是主要论点吗?
【问题讨论】:
-
new Boolean(true)不等于true
标签: javascript
很多人说你应该避免使用 new Object、new Array() 而是使用 {}。 [] 和真/假。
使用字面量构造来获取对象或数组的新实例而不是使用 new 有什么好处?我知道 Crockford 不喜欢 new 但这是主要论点吗?
【问题讨论】:
new Boolean(true) 不等于 true
标签: javascript
对象和数组字面量相对于使用各自的构造函数的优点是:
Array 或 Object 构造函数被覆盖时,文字仍然可以工作在数组的情况下,文字还有一个额外的优势:不可能单独使用Array 构造函数来创建具有单个成员的数组。例如,[3] 将创建一个包含一个元素为数字 3 的数组,而new Array(3) 创建一个长度为 3 的数组。
更新:现在问题已被编辑,以下段落不再相关。
关于布尔值,您似乎有一个误解:new Boolean(false) 与false 不一样。 Boolean() 构造函数创建一个布尔对象,而 false 和 true 是布尔基元。事实上,new Boolean(false) 在例如if 语句中强制转换为布尔值时,其计算结果为true。简而言之,很少有理由使用Boolean() 构造函数。请改用true 和false。类似地,字符串和数字等其他原语具有相应的 String() 和 Number() 构造函数,它们生成的 String 和 Number 对象与原始字符串和数字不同,通常应避免使用。
例如,如果你想这样做:
{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...) 就快得多了!
.push()。这里的问题更多是关于构造函数new Array(val1,val2,val3...) 与文字[val1,val2,val3...]
new Object() 和 new Array() 当您需要构建大量它们然后经常设置/附加数据时要快得多。在解析器/解码器中,使用它们会显着提高速度。
我认为主要是为了简洁。
当你可以写[]时为什么写new Array(),或者当你可以写{}时写new Object()?
另外new Boolean() 完全是多余的。布尔值总是需要为真或假,因此您绝对应该为此使用内置常量。
【讨论】:
new Boolean(true) 比冗余更糟糕,它与原始 true 不同。看我的回答。
在大多数情况下,object literal 或数组字面量就足够且更易于使用。你甚至可以调用或应用原型方法(例如 [].prototype.slice.call(someObj))它也大多是 faster。
您可能需要注意 {} 和 [] 的构造函数不能被覆盖,并且
Object 和 Array 是构造函数,其中 {} 和 [] 是实例。
【讨论】:
尚未提及的一个原因是在将参数传递给 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
【讨论】: