Unexpected 'typeof'. Use '===' to compare directly with undefined.
if (typeof exports !== 'undefined') {
这是来自backbone.js 的代码。
它似乎不喜欢这种语法。
如何更改此代码以使 jslint.com 满意?
Unexpected 'typeof'. Use '===' to compare directly with undefined.
if (typeof exports !== 'undefined') {
这是来自backbone.js 的代码。
它似乎不喜欢这种语法。
如何更改此代码以使 jslint.com 满意?
Underscore 库(由制作 Backbone 和 CoffeeScript 的同一个人创建,因此您知道这是经过深思熟虑的)其isUndefined
功能使用以下内容:
obj === void 0
如果您想要一个完全安全的(即使在某人重新定义的奇怪情况下undefined
)方法,那仍然会让脾气暴躁的老 Crockford(编写 JSLint 的人)高兴,我会使用该检查。虽然看起来有点尴尬,所以至少我会对此进行解释性评论。
更好的是,您可以将其汇总到您自己的isUndefined
函数中,例如下划线。或者更好的是,您可以首先使用 Underscore 的功能;如果您使用 Backbone,则您已经有了 Underscore,因为 Backbone 需要它。
It appears as though jsLint expects a direct comparison to undefined
instead of using the typeof foo === "undefined"
trick.
Using typeof exports === "undefined"
gives the same error, but using exports === undefined
passes jsLint:
var exports;
var test;
if (exports === undefined) {
test = "foobar";
}
This is a cleaner way to check for undefined
, and probably less prone to mistakes like exports === "undefined"
or typeof exports === undefined
.
为了确保 undefined 没有被重新定义:
var is_undefined=(function(undefined){
return function(a){return a===undefined;};
}(/*omitted argument is undefined*/));
利用省略的参数未定义的事实。
更新
更简单的方法是
function is_undefined(x){return x===[][0];}
回答如何在不使用函数或替代typeof
.
JSLint 错误消息可以通过声明使用的结果来绕过typeof
。
var hasExports = typeof exports;
if (hasExports !== 'undefined') {
//...
}
您可以编写一个不会打扰 jsLint 的函数。
function getTypeof(obj) {
'use strict';
return typeof obj;
}
然后你可以调用 getTypeof 函数而不是直接使用 typeof。
var exports,
test;
if (getTypeof(exports) === "undefined") {
test = "foobar";
}
似乎需要做很多额外的工作,但我仍然不明白为什么 Crockford 反对在 if 语句中使用 typeof。