Unexpected 'typeof'. Use '===' to compare directly with undefined.
if (typeof exports !== 'undefined') {
这是来自backbone.js的代码。
它似乎不喜欢语法。
如何更改此代码以使jslint.com满意?
答案 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。