下面这些基于构造函数的创建对象的语法有什么区别:

person = new Object()

...这个文字语法:

person = {
    property1 : "Hello"
};

看起来两者都做同样的事情,尽管JSLint更喜欢使用对象文字表示法。

哪个更好,为什么?


当前回答

它们都做同样的事情(除非有人做了不寻常的事情),除了第二个创建一个对象并向其添加一个属性。但是文字符号在源代码中占用的空间更少。可以清楚地看出发生了什么,因此使用new Object()实际上只是输入了更多内容,并且(理论上,如果JavaScript引擎没有优化的话)执行了不必要的函数调用。

这些

person = new Object() /*You should put a semicolon here too.  
It's not required, but it is good practice.*/ 
-or-

person = {
    property1 : "Hello"
};

技术上不要做同样的事情。第一个只是创建一个对象。第二个创建一个并分配一个属性。为了使第一个是相同的,然后需要第二步来创建和分配属性。

有人可以做的“不寻常的事情”将是对默认的Object全局变量进行阴影或赋值:

// Don't do this
Object = 23;

在这种极不寻常的情况下,new Object将失败,但{}将工作。

在实践中,从来没有理由使用new Object而不是{}(除非您做了非常不寻常的事情)。

其他回答

2019年更新

我在OSX High Sierra 10.13.6节点10.13.0版本上运行了与@rjloura相同的代码,这些是结果

console.log('Testing Array:');
console.time('using[]');
for(var i=0; i<200000000; i++){var arr = []};
console.timeEnd('using[]');

console.time('using new');
for(var i=0; i<200000000; i++){var arr = new Array};
console.timeEnd('using new');

console.log('Testing Object:');

console.time('using{}');
for(var i=0; i<200000000; i++){var obj = {}};
console.timeEnd('using{}');

console.time('using new');
for(var i=0; i<200000000; i++){var obj = new Object};
console.timeEnd('using new');


Testing Array:
using[]: 117.613ms
using new: 117.168ms
Testing Object:
using{}: 117.205ms
using new: 118.644ms

唯一一次我将使用'new' keyowrd对象初始化是在内联箭头函数:

() => new Object({ key: value})

因为下面的代码是无效的:

() => { key: value} //  instead of () => { return { key: value};}

这里有很多很好的答案,但我想用我的50美分来回答。

所有这些答案所缺少的是一个简单的类比,它适用于刚开始学习编程语言的人。

希望我能用这个类比来填补这个空白:

对象文字创建vs基于构造函数的语法

感受句子创作的不同之处。

如果我有一句话“我喜欢奶酪”,我可以清楚响亮地(字面上,或逐字逐句地)告诉你:我喜欢奶酪。

这是我逐字逐句创造的句子。

所有其他的方法都是一些棘手的方法来让你理解我到底创造了什么句子。例如,我告诉你:

在我的句子中,主语是“I”,宾语是“cheese”,谓词是“to like”。 这是你学习同一句话的另一种方式,没有任何歧义:“我喜欢奶酪”。

Or,

我的句子有3个单词:第一个是英语字典里的第n个单词,第二个是英语字典里的第m个单词,最后一个是英语字典里的第l个单词。

在这种情况下,你也会得到同样的结果:你确切地知道这句话是什么。

你可以设计任何其他方法,这将不同于“逐字”的句子创建(字面),这将是间接(非字面,非逐字)的句子创建方法。

我认为这是这里的核心概念。

如果您创建10,000个实例,内存使用情况将有所不同。 new Object()将只保留一个副本,而{}将保留10,000个副本。

另外,根据O'Really的一些javascript书籍....(引用)

使用字面量而不是Object构造函数的另一个原因是没有作用域解析。因为有可能您已经创建了具有相同名称的局部构造函数,解释器需要从调用Object()的位置一直查找作用域链,直到找到全局Object构造函数。