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

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

这是来自backbone.js 的代码。

它似乎不喜欢这种语法。

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

4

5 回答 5

4

Underscore 库(由制作 Backbone 和 CoffeeScript 的同一个人创建,因此您知道这是经过深思熟虑的)其isUndefined功能使用以下内容:

obj === void 0

如果您想要一个完全安全的(即使在某人重新定义的奇怪情况下undefined)方法,那仍然会让脾气暴躁的老 Crockford(编写 JSLint 的人)高兴,我会使用该检查。虽然看起来有点尴尬,所以至少我会对此进行解释性评论。

更好的是,您可以将其汇总到您自己的isUndefined函数中,例如下划线。或者更好的是,您可以首先使用 Underscore 的功能;如果您使用 Backbone,则您已经有了 Underscore,因为 Backbone 需要它。

于 2013-01-30T00:47:21.217 回答
3

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.

于 2013-01-30T00:32:51.480 回答
2

为了确保 undefined 没有被重新定义:

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

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

更新

更简单的方法是

function is_undefined(x){return x===[][0];}
于 2013-01-30T06:36:13.637 回答
1

回答如何在不使用函数或替代typeof.

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

var hasExports = typeof exports;
if (hasExports !== 'undefined') {
   //...
}
于 2014-11-25T21:09:06.610 回答
0

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

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

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

var exports,
    test;

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

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

于 2014-12-24T00:32:12.847 回答