【问题标题】:Why is it a bad idea to allow these in JavaScript == , != , ++ , --为什么在 JavaScript == , != , ++ , -- 中允许这些是个坏主意
【发布时间】:2011-03-22 10:16:54
【问题描述】:

我正在查看JSLint,其中一些规则激起了我的兴趣。特别是这个:

禁止 == 和 !=

禁止 ++ 和 --

为什么禁止这些是个坏主意?我理解第一部分,基本上它要我做=== 而不是==。 我不明白为什么。我了解两者之间的区别,我只是想知道为什么这是不好的做法。有时我真的很想做==,这样它就可以为undefined == null评估true

第二个,嗯,我完全不明白。它要我做 myInt += 1 而不是 myInt++ 吗?

谢谢!

【问题讨论】:

  • 看了大家的回答,现在才明白为什么JSLint的slogan是“JSLint会伤害你的感情”。
  • @Matthew,你为什么投票结束我的问题?您链接的另一个没有解决我关于 == 和 != 的问题(尽管它确实谈到了 ++ 和 --)
  • 我明白你的意思。也许我不应该知道,但您似乎基本了解 ==/=== 问题。
  • @Matthew,是的,我理解其中的区别,我只是不清楚“为什么”部分,而这确实应该是我问题的重点(“为什么”)。

标签: javascript operators


【解决方案1】:

我不太同意这些规则,与其不鼓励使用==,我建议了解类型强制。

Crockford 想要避免== 的主要原因是,取决于操作数类型的比较规则可以使此运算符不可传递,例如,如果:

A == B AND
B == C

不保证:

A == C

一个真实的例子:

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

当你比较相同类型的值时,严格的=== 运算符并不是真正需要的,例如:

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

我们比较 typeof 运算符的结果,它是 always 一个字符串,与一个字符串文字...

另一个例子,当你将某事物与null 进行比较时,== 也会与undefined 进行比较,例如:

if (something == null) {}

VS

if (something === null || typeof something === "undefined") {}

上述两个条件最终是等效的,但第一个条件更易读,当然,如果您了解类型强制以及 == 的行为方式。

了解== 运算符的工作原理,将帮助您明智地决定使用哪个。

推荐文章:

【讨论】:

  • 我认为 '0' == 0 评估为 true 对我来说是有意义的,它给了我灵活性,让我可以编写更少的代码。
  • 类比:我对静态类型了如指掌,但我仍然希望我的编译器为我强制执行它。
  • @7wp:混合类型比较的一个问题是someNumber == someString 没有表明程序员是否关心如果不同的评估方法会产生不同的结果会发生什么,或者期望操作数会总是这样,所有的评估方法都会产生相同的结果。恕我直言,一种好的语言应该只允许在没有歧义且传递性得到支持的情况下进行此类比较。
【解决方案2】:

Doug Crockford 对 Javascript 中的“好”和“坏”有自己的看法。因此,JSLint 实现了这些检查,但如果您不完全同意他的意见,则将它们设为可选。

禁止== 有助于防止您在您的真正意思是=== 时犯错。当然,这假设您从未真正想使用==。

禁止++ 和-- 是一种风格,有些人认为它们比+= 1 和-= 1 更难阅读。

【讨论】:

  • 对.. 我想我想知道的是为什么他会认为那些“好”,即使我不同意。只是想知道他的观点。
  • 我建议阅读 Javascript: The Good Parts 了解有关 Crockford 观点的完整详细信息。
【解决方案3】:

Douglas Crockford(编写 JSLint 的人)在这段视频中解释了自己:

http://www.youtube.com/watch?v=hQVTIJBZook#t=14m45s

但基本上(正如其他所有人都提到的那样)这是因为强制类型。

说实话,值得一看 who 视频 - 非常有趣和有用。

【讨论】:

  • 谢谢你的链接,我会看的。
  • 那个视频很有帮助,它解释了很多。现在我也有兴趣读他的书。
  • 很高兴听到这个消息! :) 他的书也很好,可能是最好的 JavaScript 文本!可以想象,它极大地扩展了视频中的内容。不要被它仅仅约 150 页所迷惑。可能是我读过的最密集的技术书籍。一页一页是一个讨价还价。附言- 我没有为此获得佣金;)
【解决方案4】:

来自instructions:

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

和

众所周知,++(递增)和 --(递减)运算符会通过鼓励过多的技巧来导致糟糕的代码。它们在启用病毒和其他安全威胁方面仅次于错误的架构。有一个 plusplus 选项禁止使用这些运算符。

【讨论】:

    【解决方案5】:

    == 和 != 运算符在需要时执行运算符的隐式转换,而 === 和 !== 运算符不这样做。例如,表达式4 == '4' 为真,而表达式4 === '4' 为假。

    最好您应该知道您正在处理的数据类型,以便您可以在代码中进行适当的比较。

    ++ 和 -- 运算符在语句中单独使用不会引起任何问题,但它们通常用于以不那么明显的方式执行多个操作的语句,例如:

    arr[++idx] = 42;
    

    这样会更清楚:

    idx += 1;
    arr[idx] = 42;
    

    【讨论】:

      【解决方案6】:

      标准相等运算符(== 和 !=)的行为取决于 JavaScript 版本。所以这是不使用它们的原因之一。

      另一个原因是 = 的行为往往非常模糊。

      见https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Operators/Comparison_Operators

      【讨论】:

        【解决方案7】:

        我了解==。 (undefined == null 是个例外)

        ("0" == false) === true
        ("0" === false) === false
        

        不过,我从来不理解 ++ 和 -- 的事情。我不喜欢在我的代码中使用i+=1(它比++i 慢)。

        【讨论】:

        • --x+++x-x++。做作,但我唯一反对++ 和-- 的论点。 :)
        • 但这是:--x+ ++x-x++(仅添加了一个空格),而且几乎一样糟糕
        • 在不运行代码的情况下,如果运行以下代码会提示什么? var x = 3; alert(--x+ ++x-x++); alert(x);
        猜你喜欢
        • 2019-04-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-20
        • 1970-01-01
        • 2017-01-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多