代码之家  ›  专栏  ›  技术社区  ›  Metropolis

jslint应为“==”,而不是看到“==”

  •  80
  • Metropolis  · 技术社区  · 14 年前

    最近,当我发现这个错误时,我通过jslint运行了一些代码。不过,我觉得这个错误很有趣,因为它自动地假定所有的==都应该是==。

    这真的有道理吗?我可以看到很多你不想比较类型的例子,我担心这会导致问题。

    “预期”这个词意味着每次都应该这样做……这对我来说是没有意义的。

    8 回复  |  直到 9 年前
        1
  •  121
  •   jsalonen    10 年前

    IMO,盲目使用 === ,而不是试图 理解 怎样 类型转换 工作没有多大意义。

    初级 害怕 关于equals运算符 == 是否根据比较类型的比较规则可以使运算符不可传递,例如,如果:

    A == B AND
    B == C
    

    并不能保证:

    A == C
    

    例如:

    '0' == 0;   // true
     0  == '';  // true
    '0' == '';  // false
    

    严格等号运算符 = = 在比较同一类型的值(最常见的示例)时,这不是真正必要的:

    if (typeof foo == "function") {
      //..
    }
    

    我们比较了 typeof 运算符 总是 一串 ,用 一串 字面意义的。。。

    或者当您知道类型强制规则时,例如,检查 null undefined 某物:

    if (foo == null) {
      // foo is null or undefined
    }
    
    // Vs. the following non-sense version:
    
    if (foo === null || typeof foo === "undefined") {
      // foo is null or undefined
    }
    
        2
  •  24
  •   Daniel Vandersluis    14 年前

    JSlint本质上比JavaScript语法所允许的防御性更强。

    从jslint文档中:

    这个 == != 运算符在比较之前执行类型强制。这很糟糕,因为它会导致 ' \t\r\n' == 0 是真的。这会掩盖类型错误。

    当与以下任何值进行比较时,请使用 === !== 运算符(不执行类型强制): 0 '' undefined null false true

    如果你只关心一个价值 诚实的 法西 ,然后使用短格式。而不是

    (foo != 0)

    只要说

    (foo)

    而不是

    (foo == 0)

    (!foo)

    这个 = = != 操作人员优先。

        3
  •  17
  •   Justin Niessner    14 年前

    请记住,jslint强制一个人知道什么是好的javascript。在实现它所建议的更改时,您仍然必须使用常识。

    一般来说,比较类型和值会使代码更安全(当类型转换没有按您认为的方式进行时,您不会遇到意外的行为)。

        4
  •  12
  •   outis nihil    11 年前

    Triple Equal与Double Equal不同,因为除了检查两边的值是否相同外,Triple Equal还检查它们是否是相同的数据类型。

    所以 ("4" == 4) 是真的,但是 ("4" === 4) 是假的。

    TripleEqual的运行速度也稍快,因为在给出答案之前,JavaScript不必浪费时间进行任何类型转换。

    JSlint旨在使您的javascript代码尽可能严格,以减少不明显的错误。它强调了这类事情,试图让您以一种强制您尊重数据类型的方式编码。

    但jslint的好处在于它只是一个指南。正如他们在网站上所说,这会伤害你的感情,即使你是一个很好的javascript程序员。但你不应该觉得有义务听从它的建议。如果你已经阅读了它要说的内容,并且你理解了它,但是你确信你的代码不会被破坏,那么你就没有强迫自己去改变任何东西。

    如果你不想受到警告的轰炸,你甚至可以告诉jslint忽略检查的类别,因为你不会做任何事情。

        5
  •  8
  •   Lekensteyn    14 年前

    引文 http://javascript.crockford.com/code.html :

    = =和!==算符。

    几乎总是最好使用 = =和!==算符。=和!=运算符执行类型强制。在 特别是,不要使用==进行比较 反对虚伪的价值观。

    jslint非常严格,他们的webjslint.js甚至没有通过自己的验证。

        6
  •  3
  •   EM-Creations    11 年前

    为了帮助解释这个问题并解释为什么Netbeans(来自)7.3已经开始显示这个警告,这是从Netbeans bug跟踪器上的响应中提取的,当有人将此报告为bug时:

    在JavaScript中使用==而不是==是一个很好的实践。

    =和!=运算符在比较之前执行类型强制。这很糟糕,因为 它使'\t\r\n'==0为真。这会掩盖类型错误。JSLNT不能 可靠地确定==是否正确使用,因此最好不要使用== 而且!=和总是使用更可靠的==和!==算符 相反。

    Reference

        7
  •  2
  •   Rushyo    14 年前

    好吧,这不会真的造成问题,只是给你建议而已。拿着还是放着。也就是说,我不知道它有多聪明。在某些情况下,它可能不会将其作为一个问题呈现。

        8
  •  2
  •   nano2nd    9 年前

    如果你想测试失态。jslint不允许

    if (foo == null)
    

    但确实允许

    if (!foo)