【问题标题】:why does JSLint recommend x === "undefined" vs. typeof x == "undefined"?为什么 JSLint 推荐 x === "undefined" vs. typeof x == "undefined"?
【发布时间】:2012-10-23 15:03:24
【问题描述】:

我对 JSLint 感到困惑。

我的代码最初检查 div:jqmData("me") 是否像这样未定义:

if ( typeof el.jqmData("me") == "undefined"  
   ? el.not(':jqmData(panel="main")').length > 0 
    : el.not(':jqmData(me="first")').length > 0 ){

}

JSLint 抱怨我应该用typeof 代替检查===,所以我这样做了:

if ( el.jqmData("me") === "undefined"  
   ? el.not(':jqmData(panel="main")').length > 0 
     : el.not(':jqmData(me="first")').length > 0 ){

}

JSLint 不再抱怨了,但是我的嵌套 if 语句被破坏了,因为我现在总是以第二个 if el.not(':jqmData(me="first")').length 结束,即使我不应该这样做。

问题
为什么 JSLint 推荐 === 而不是 typeof == undefined?这怎么会打破我的逻辑?

感谢您的启发......

【问题讨论】:

  • x === undefined,不是x === 'undefined'
  • @zerksm:请回答!
  • 根据您检查的内容,使用typeof someVar === 'undefined' 比使用someVar === undefined 有一个优势,即如果someVar 实际上没有定义,则前者不会中断。例如,如果someVar 尚未声明,您将使用后者获得ReferenceError,而前者工作顺利。见:stackoverflow.com/questions/4725603/…(抄送@zerkms)
  • @NullUserException: 是的,检查变量是有意义的(与属性相反)

标签: javascript jquery undefined jslint typeof


【解决方案1】:

你打破了比较逻辑。假设您使用

typeof el.jqmData("me") === "undefined"  

el.jqmData("me") === undefined

我个人会选择后者。

我个人认为在这种特殊情况下这种特殊的 JSLint 检查没有多大意义。

【讨论】:

  • 是的。同意。感谢您的澄清。很好,我找到了这个,我一直在改变这个......
  • 但是如果你想测试一个变量是否被定义,这不起作用:(someundefinedvar === undefined) 是一个referenceError。然而,即使我在测试变量 def,JSLint 仍然会抱怨它。
  • @mattacular:是的,我错过了,因为我不经常检查
【解决方案2】:

zerkms 写的是正确的。不过,来自https://github.com/jamesallardice/jslint-error-explanations/issues/10#issuecomment-18273885 的解释可能会有所帮助:

通过undefined 比较,风格发生了现代化。 ES5 保证undefinedundefined。在严格模式下,与新旧样式相比,typeof "undefined" 检查的输入时间更长,现在可以直接比较 undefined 不再需要。

查看 JSLint 讨论: https://plus.google.com/101248256976407044060/posts/Q5oFnnxG9oL

Crockford 基本上说typeof "undefined" 检查更长更慢并且没有必要。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多