Jslint不喜欢!==,似乎更喜欢===,与typeof的关系

时间:2013-01-30 00:20:09

标签: javascript backbone.js jslint

Unexpected 'typeof'. Use '===' to compare directly with undefined.

    if (typeof exports !== 'undefined') {

这是来自backbone.js的代码。

它似乎不喜欢语法。

如何更改此代码以使jslint.com满意?

5 个答案:

答案 0 :(得分:4)

Underscore库(由制作Backbone和CoffeeScript的同一个人创建,因此您知道它经过精心设计)将isUndefined函数用于以下内容:

obj === void 0

如果你想要一个完全安全的(即使是在某人重新定义undefined)方法的奇怪情况下,那仍然会让那个胡思乱想的老Crockford(写JSLint的人)感到高兴,我会使用那个检查。虽然看起来很尴尬,所以至少我会用它做一个解释性的评论。

更好的是,您可以将其添加到您自己的isUndefined函数中,例如Underscore。或者更好的是,你可以首先使用Underscore的功能;如果您正在使用Backbone,那么您已经拥有了Underscore,因为Backbone需要它。

答案 1 :(得分:3)

似乎jsLint希望直接与undefined进行比较,而不是使用typeof foo === "undefined"技巧。

使用typeof exports === "undefined"会出现同样的错误,但使用exports === undefined会传递jsLint:

var exports;
var test;

if (exports === undefined) {
    test = "foobar";
}

这是一种检查undefined的更简洁方法,可能不太容易出现exports === "undefined"typeof exports === undefined等错误。

答案 2 :(得分:2)

确保未定义undefined:

var is_undefined=(function(undefined){
  return function(a){return a===undefined;};
}(/*omitted argument is undefined*/));

利用省略的参数未定义的事实。

<强>更新

更简单的方法是

function is_undefined(x){return x===[][0];}

答案 3 :(得分:1)

回答如何在不使用typeof的功能或替代方案的情况下使JSLint满意的原始问题。

通过声明使用typeof的结果,可以绕过JSLint错误消息。

var hasExports = typeof exports;
if (hasExports !== 'undefined') {
   //...
}

答案 4 :(得分:0)

你可以编写一个不会打扰jsLint的函数。

function getTypeof(obj) {
  'use strict';
  return typeof obj;
}

然后你可以调用getTypeof函数而不是直接使用typeof。

var exports,
    test;

if (getTypeof(exports) === "undefined") {
    test = "foobar";
}

似乎还有很多额外的工作,我仍然不明白为什么Crockford反对在if语句中使用typeof。