替换
Object(obj)
使用
{}.constructor(obj)
它们完全相同吗?
初步测试显示它们是。
为什么第二个版本传递jslint而不是第一个?
答案 0 :(得分: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();
无论window.Object的状态如何,对象文字概念var x = {};
都会成功。
答案 1 :(得分:1)
不确定你是否简化了这些,但两种陈述都不是特别好。 Crockford确实建议不要使用new Object()
符号并且更喜欢{}
,你会看到很多js开发人员都会这样做。
使用var Something = {}
vs var Something = new Object()
最后可以保存角色,但最后,这确实是一个偏好问题。还有一些人会告诉你,当你使用对象文字时,它更容易阅读。由于列出here作为第三个原因,如果有人覆盖了Object函数,那将无关紧要。
使用每个优点都有一些优势,this question有更多关于它的讨论。
无论哪种方式,如果您正在执行new Object()
并启用/*jshint newcap:true*/
选项,那么您应该没问题。
答案 2 :(得分:1)
它们完全相同吗?
没有。可以覆盖全局Object
变量或Object.prototype.constructor
属性以获得不同的结果。
为什么第二个版本传递jslint而不是第一个?
“错误”消息应告诉您:
Use the object literal notation {} or Object.create(null).
此消息实际上应该[仅]显示new Object
的使用情况(因为它Crockford considers new
harmful和object literal notation is cleaner非常合理。)出于某种原因,jslint也会为您的代码提出警告,尽管它不适用。永远不要相信JsLint,它不了解您的代码,只扫描它的初学者错误模式。
您对Object
函数的使用完全没问题,您不是要创建新对象。
答案 3 :(得分:0)
这不仅很好,对于大多数情况来说它只是唯一的解决方案! 按建议使用Object.create(undefined)与Object(undefined),导致TypeError!
它还会导致不必要的(甚至破坏的)对象副本: Object.create(new Date())。getDate();