为什么使用{}代替新的Object()并使用[]而不是new Array()和true / false而不是new Boolean()?

时间:2010-11-27 14:14:24

标签: javascript

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

使用文字结构获取Object或Array的新实例而不是使用new有什么好处?我知道Crockford不喜欢新的,但这是主要论点吗?

5 个答案:

答案 0 :(得分:8)

对象和数组文字相对于使用相应构造函数的优点是:

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

对于数组,还有一个文字的额外优点:单独使用Array构造函数创建一个包含单个成员的数组是不可能的。例如,[3]将创建一个数组,其中一个元素是数字3,而new Array(3)创建一个长度为3的数组。

更新:现在问题已被修改,以下段落已不再适用。

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

答案 1 :(得分:4)

例如,如果你想这样做:

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

新的Object()方式是:

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

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

答案 2 :(得分:3)

我认为这主要是关于简洁。

为什么在撰写new Array()时可以写[],或在写new Object()时写{}

同样new Boolean()完全是多余的。布尔值总是需要为true或false,所以你绝对应该使用内置常量。

答案 3 :(得分:1)

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

答案 4 :(得分:0)

尚未提及的一个原因是将参数传递给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