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

person = new Object()

...这个文字语法:

person = {
    property1 : "Hello"
};

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

哪个更好,为什么?


当前回答

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

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

其他回答

我发现ES6/ES2015有一个不同之处。不能使用简写箭头函数语法返回对象,除非用new object()包围对象。

> [1, 2, 3].map(v => {n: v});
[ undefined, undefined, undefined ]
> [1, 2, 3].map(v => new Object({n: v}));
[ { n: 1 }, { n: 2 }, { n: 3 } ]

这是因为编译器被{}括号搞糊涂了,认为n: i是一个label:语句结构;分号是可选的,所以它不会抱怨。

如果向对象添加另一个属性,它最终会抛出一个错误。

$ node -e "[1, 2, 3].map(v => {n: v, m: v+1});"
[1, 2, 3].map(v => {n: v, m: v+1});
                           ^

SyntaxError: Unexpected token :

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Or,

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

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

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

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

在我的机器上使用Node.js,我运行如下:

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');

注意,这是这里的扩展:为什么arr =[]比arr = new Array快?

我的输出如下:

Testing Array:
using[]: 1091ms
using new: 2286ms
Testing Object:
using{}: 870ms
using new: 5637ms

因此,显然{}和[]在创建空对象/数组时比使用new更快。