【问题标题】:In Javascript, is A == !B always the same as A != B在 Javascript 中,A == !B 是否始终与 A != B 相同
【发布时间】:2017-02-19 08:09:53
【问题描述】:

重构一些旧代码,发现如下:

someVar == !otherVar

看起来不太清楚,我认为可以写成:

someVar != otherVar

这样做似乎合乎逻辑。但是,既然是Javascript,我怕附带问题,这样真的可以吗?

【问题讨论】:

  • 这些变量的值的类型/范围是什么?
  • @Amit 通常为布尔值,但我之所以问是因为并非总是如此。想象一下它们是字符串还是其他东西。
  • someVar != otherVar 等价于!(someVar == otherVar),其他一切都依赖于otherVar
  • @Bergi 你说得对。在逻辑上,我认为我可以否定整个表达式,但不能否定比较本身。
  • 您可以用于布尔值,但不能用于其他类型。您将需要一些值,将其转换为布尔值和取反确实会反转所有与所有其他值的比较结果。这非常罕见。

标签: javascript logic boolean-logic boolean-expression


【解决方案1】:

答案是

Infinity == !NaN; // false
Infinity != NaN; // true

'abc' == !false; //false
'abc' != false; // true

打开控制台并亲自检查。还有很多例子。

【讨论】:

  • 请使用 sn-ps - 指导人们“检查自己”是不好的做法。
  • 你有@Azamantes !也许是一个边缘案例,但这绝对有可能发生。
  • 还有{} != null或者[] != null,或者null != false1 != Infinity等等。现在解释一下如何?
【解决方案2】:

实际上,这些陈述本身是非常不同的。 !aVar 将强制该 var 为布尔值。例如'!0' = true,'!1' 或任何其他数字将是 false。 其他一些例子!'' = true !'abc = false。

!= 进行了宽松(不)等式比较,这取决于类型转换可能会产生非常不同的结果。

例如

5 != 6 //true
5 == !6 //false -> !6 is forced to a boolean (6=true,!6 = false), for the comparisson 5 is cast to a boolean (true), so the comparisson nets false
5 != 5 //false
5 == !5 //false, but because the same reason as above !5 becomes true, etc.

您提到的旧代码可能正是出于布尔化otherVar 的原因使用它。如果 someVar 已经是一个布尔值,那么这样做是有意义的。对于所有其他比较,它可能会给出错误的结果。

【讨论】:

  • 我担心的正是它正在对 var 进行某种类型的转换/布尔化,在这种情况下,我可能会通过重构它来引入错误。感谢您的澄清!
猜你喜欢
  • 1970-01-01
  • 2021-10-06
  • 2014-03-29
  • 2011-10-20
  • 2010-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多