为什么jslint不喜欢Object(obj)

时间:2013-06-25 20:37:29

标签: javascript jslint

替换

Object(obj)

使用

{}.constructor(obj)

它们完全相同吗?

初步测试显示它们是。

为什么第二个版本传递jslint而不是第一个?

4 个答案:

答案 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 harmfulobject literal notation is cleaner非常合理。)出于某种原因,jslint也会为您的代码提出警告,尽管它不适用。永远不要相信JsLint,它不了解您的代码,只扫描它的初学者错误模式。

您对Object函数的使用完全没问题,您不是要创建新对象。

答案 3 :(得分:0)

这不仅很好,对于大多数情况来说它只是唯一的解决方案! 按建议使用Object.create(undefined)与Object(undefined),导致TypeError!

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