【问题标题】:Why does jslint prefer {}.constructor(obj) over Object(obj)为什么 jslint 更喜欢 {}.constructor(obj) 而不是 Object(obj)
【发布时间】:2014-08-19 02:47:36
【问题描述】:

两者都将检测对象而不是基元。

这似乎是纯粹的语法差异。

// jslint prefers {}.constructor(obj) over Object(obj)
// called isObject by underscore
// will test only for objects that have writable keys
// for example string literals will not be detected
// but arrays will
var isWritable = function (obj) {
    return {}.constructor(obj) === obj;
};

【问题讨论】:

  • 我认为这可能与 javascript 的运行速度有关。 {}.constructor(obj) 可能在大多数 javascript 引擎中都有某种 Object(obj) 没有的优化。
  • @user,你的意思是({}).constructor(obj)吗?纯 {}.constructor(obj) 导致我的浏览器出现语法错误。
  • 我在上面发布的代码工作正常。但是当我把它分解并放在控制台中时,我得到了和你一样的错误。很奇怪。
  • @user,没关系,那是 return 关键字。它可以防止解析器将{} 解释为空语句块。该代码确实运行良好。
  • 我唯一能想到的是Object 不是保留字,所以混蛋可以说:Object = function(x) { /* be a jerk */ } 其中{}.constructor 将始终为您提供对象构造函数。

标签: javascript jslint


【解决方案1】:

我不太确定,因为它不应该。如果您关注的是性能,那么这与您应该做的相反。

根据this JSPerf test available which compares the speed of creating via new Object(), Object.create().new(), and Object.prototype.constructor()(与Object.constructor()相同); Object.constructor() 是迄今为止最慢​​的一个

Google 的 V8 引擎使用 new Object() 的速度要快很多,因为它极大地优化了调用,所以我真的不用担心。

JSPerf 测试结果:

【讨论】:

    【解决方案2】:

    这是误报。使用Object,更简洁、更清晰、更快捷。

    JSLint does not expect to see new Object.”-你should use an object literal instead是可以理解的。但是,错误地发出了相同的警告even if Object is called as a function。这可能是为了检测Object() 的创建,但使用参数调用Object 并没有错。

    【讨论】:

    • 你应该向 jslint 提交一个错误,这看起来像一个。
    • @BenjaminGruenbaum:我已经发了一封电子邮件,好像没有错误跟踪器。
    • ……但我得到的只是评论“不。不要那样做。”。因此,为了让 JSLint 满意,我们似乎应该 a) 将 Object 别名为其他名称 (var o = Object; return o(obj) === obj;),或者 b) 使用稍长一点的 (obj !== null && typeof obj === "object") || typeof obj === "function";
    猜你喜欢
    • 2012-10-27
    • 1970-01-01
    • 2015-08-13
    • 1970-01-01
    • 1970-01-01
    • 2014-09-03
    • 2011-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多