3

更换

Object(obj)

{}.constructor(obj)

它们完全等价吗?

初步测试表明它们是。

为什么第二个版本通过 jslint 而不是第一个?

4

4 回答 4

5

这是差异的摘要(取自jslinterrors):

// Overwrite the Object function.
window.Object = 10;

// Execution of the following will raise: 
// "TypeError: number is not a function" (Chrome)
var x = new Object();

var x = {};无论 window.Object 的状态如何,对象字面量概念都会成功。

于 2013-06-25T21:20:27.883 回答
1

不确定您是否在简化这些,但是这两个语句看起来都不是特别好。Crockford 确实不建议使用这种new Object()表示法,并且更喜欢{}你会看到很多 js 开发人员遵循的表示法。

使用var Something = {}vsvar Something = new Object()最终可以节省您的角色,但最终,这确实是一个偏好问题。还有一些人会告诉你,当你使用对象文字时它更容易阅读。正如这里列出的第三个原因,是否有人覆盖了 Object 函数并不重要。

使用每个都有一些优点,这个问题对此进行了更大的讨论。

无论哪种方式,如果您正在这样做new Object()并且/*jshint newcap:true*/启用了该选项,那么您应该没问题。

于 2013-06-25T21:09:45.360 回答
1

它们完全等价吗?

不,可以覆盖全局Object变量或Object.prototype.constructor属性以获得不同的结果。

为什么第二个版本通过 jslint 而不是第一个?

“错误”消息应该告诉您:

Use the object literal notation {} or Object.create(null).

该消息实际上应该 [仅] 出现在new Object(在它非常合法的情况下,因为Crockford 认为new有害对象文字表示法更清洁)的用法。出于某种原因,jslint 也会为您的代码发出警告,尽管它不适用。永远不要相信 JsLint,它不理解您的代码,而只会扫描它以查找初学者错误模式。

您对该Object函数的使用完全没问题,您没有尝试创建新对象。

于 2013-07-03T21:29:48.367 回答
0

这不仅很好,而且在大多数情况下,它是唯一的解决方案!建议的 Object.create(undefined) 与 Object(undefined) 会导致 TypeError!

它还会导致不必要的(甚至损坏的)对象副本: Object.create(new Date()).getDate();

于 2014-01-07T05:32:35.540 回答