很多人说你应该避免使用新的Object,新的Array()而是使用{}。 []和真/假。
使用文字结构获取Object或Array的新实例而不是使用new有什么好处?我知道Crockford不喜欢新的,但这是主要论点吗?
答案 0 :(得分:8)
对象和数组文字相对于使用相应构造函数的优点是:
Array
或Object
构造函数被覆盖时,文字仍然有效对于数组,还有一个文字的额外优点:单独使用Array
构造函数创建一个包含单个成员的数组是不可能的。例如,[3]
将创建一个数组,其中一个元素是数字3,而new Array(3)
创建一个长度为3的数组。
更新:现在问题已被修改,以下段落已不再适用。
关于布尔人,你似乎有一种误解:new Boolean(false)
与false
不同。 Boolean()
构造函数创建一个Boolean对象,而false
和true
是布尔基元。实际上,new Boolean(false)
在强制转换为布尔值(例如,true
语句时评估为if
。简而言之,使用Boolean()
构造函数的理由很少。请改用true
和false
。类似地,其他基元(如字符串和数字)具有相应的String()
和Number()
构造函数,这些构造函数生成与原始字符串和数字不同的String
和Number
个对象,通常应避免使用
答案 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。
您可能需要注意{}和[]的构造函数不能被覆盖
Object
和Array
是构造函数,其中{}和[]是实例。
答案 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