更换
Object(obj)
和
{}.constructor(obj)
它们完全等价吗?
初步测试表明它们是。
为什么第二个版本通过 jslint 而不是第一个?
更换
Object(obj)
和
{}.constructor(obj)
它们完全等价吗?
初步测试表明它们是。
为什么第二个版本通过 jslint 而不是第一个?
这是差异的摘要(取自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 的状态如何,对象字面量概念都会成功。
不确定您是否在简化这些,但是这两个语句看起来都不是特别好。Crockford 确实不建议使用这种new Object()
表示法,并且更喜欢{}
你会看到很多 js 开发人员遵循的表示法。
使用var Something = {}
vsvar Something = new Object()
最终可以节省您的角色,但最终,这确实是一个偏好问题。还有一些人会告诉你,当你使用对象文字时它更容易阅读。正如这里列出的第三个原因,是否有人覆盖了 Object 函数并不重要。
使用每个都有一些优点,这个问题对此进行了更大的讨论。
无论哪种方式,如果您正在这样做new Object()
并且/*jshint newcap:true*/
启用了该选项,那么您应该没问题。
它们完全等价吗?
不,可以覆盖全局Object
变量或Object.prototype.constructor
属性以获得不同的结果。
为什么第二个版本通过 jslint 而不是第一个?
“错误”消息应该告诉您:
Use the object literal notation {} or Object.create(null).
该消息实际上应该 [仅] 出现在new Object
(在它非常合法的情况下,因为Crockford 认为new
有害且对象文字表示法更清洁)的用法。出于某种原因,jslint 也会为您的代码发出警告,尽管它不适用。永远不要相信 JsLint,它不理解您的代码,而只会扫描它以查找初学者错误模式。
您对该Object
函数的使用完全没问题,您没有尝试创建新对象。
这不仅很好,而且在大多数情况下,它是唯一的解决方案!建议的 Object.create(undefined) 与 Object(undefined) 会导致 TypeError!
它还会导致不必要的(甚至损坏的)对象副本: Object.create(new Date()).getDate();