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

Javascript Jslint不喜欢!==,似乎更喜欢==,与typeof的关系,javascript,backbone.js,jslint,Javascript,Backbone.js,Jslint,这是backbone.js中的代码 它似乎不喜欢这种语法 如何更改此代码以使jslint.com开心?似乎jslint希望直接比较未定义的,而不是使用typeof foo==“undefined”技巧 使用typeof exports===“undefined”会产生相同的错误,但使用exports===undefined会传递jsLint: Unexpected 'typeof'. Use '===' to compare directly with undefined. if (t

这是backbone.js中的代码

它似乎不喜欢这种语法


如何更改此代码以使jslint.com开心?

似乎jslint希望直接比较
未定义的
,而不是使用
typeof foo==“undefined”
技巧

使用
typeof exports===“undefined”
会产生相同的错误,但使用
exports===undefined
会传递jsLint:

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

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

这是检查
未定义
的一种更干净的方法,并且可能不太容易出现错误,例如
导出===“未定义”
导出类型===未定义

下划线库(由制作主干和咖啡脚本的同一个人创建,因此您知道这是经过深思熟虑的)将以下内容用于其
isUndefined
功能:

var exports;
var test;

if (exports === undefined) {
    test = "foobar";
}
如果你想要一个完全安全的方法(即使是在有人重新定义未定义的
的奇怪情况下),那仍然会让古怪的老克罗克福德(编写JSLint的人)感到高兴,我会使用这个检查。虽然看起来有点尴尬,但至少我会对它做一个解释性的评论


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

为了确保未定义的内容没有被重新定义:

obj === void 0
利用省略的参数是未定义的这一事实

更新

更简单的方法是

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

回答如何在不使用函数或替代
typeof
的情况下让JSLint快乐的原始问题

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

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

您可以编写一个不会影响jsLint的函数

var hasExports = typeof exports;
if (hasExports !== 'undefined') {
   //...
}
然后可以调用getTypeof函数,而不是直接使用typeof

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

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

这可能与
typeof
不会抛出引用错误有关,因此,您可以使用导出的类型==='undefined'
表示
导出===undefined
,或者导出未初始化。而且,JSLint对
很满意==,它抱怨的是
类型的
,带有
'undefined'
。它说的是“我想让你用
导出检查它!==undefined
”.如果
未定义的
已经定义了怎么办?@JasonSperske:那么很明显,我们需要修复它。@系统,但我认为这种比较方式是为了在“这是一种更干净的检查方法…”的情况下生存下来的,除了(正如上面的评论所指出的)如果
undefined
被定义为其他内容(噢,Javascript的乐趣…),这种方法可能会掩盖一个合法的错误。@machineghost:do
exports===undefined
会揭示错误,而不是掩盖错误。这就是我所说的更干净。嘿,除非有人做了
undefined=exports
。公平地说,这是不太可能的,但从技术上讲,这是一种可能性。@machineghost:是的,这是一种可能性,需要修正。如果编码环境非常不稳定,无法保证
未定义
,那么代码应该放在提供干净
未定义
变量的IIFE中。这是一种方法。。。或者你可以只使用一个
未定义的
检查来保证安全。。。特别是如果一个人已经在一个已经在使用的库中放置了这样一个检查(就像OP一样)。具有一种反常的讽刺意味的是,
void 0
检查本身并没有通过jslint。因此,我们用另一个不传递jslint的构造调用库来替换一个不传递jslint的构造。ROFL,该死的Crockford!!!;-)不过,说真的,这就是只使用下划线,并将所有Crockford讨厌的代码保留在库/依赖项文件中,而不是在组织的代码库中的原因。不管JSLint的值有多大(公平地说,我自己也使用它),我不认为有人会说,开始应用任何代码检查系统(无论是JSLint还是其他任何东西)来从外部库编写代码是一个明智的想法。是否需要在它后面加上一个0……是的……需要某种参数来工作。这是一种聪明的方法。我仍然建议大多数读者使用库来解决这样的问题,而不是一次性地解决它们,但如果你真的想自己解决它,这似乎是一个很好的方法。为什么你要这样做,而不是将所有代码放在一个提供干净的
未定义的
的生活中呢。使用函数进行简单的值比较是过分的。最后,如果重新定义了
未定义的
,则应该将其显示,而不是隐藏。
var exports,
    test;

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