在 Javascript 中,A == !B 是不是始终与 A != B 相同
Posted
技术标签:
【中文标题】在 Javascript 中,A == !B 是不是始终与 A != B 相同【英文标题】: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 你说得对。在逻辑上,我认为我可以否定整个表达式,但不能否定比较本身。
您可以用于布尔值,但不能用于其他类型。您将需要一些值,将其转换为布尔值和取反确实会反转所有与所有其他值的比较结果。这非常罕见。
【参考方案1】:
答案是否。
Infinity == !NaN; // false
Infinity != NaN; // true
'abc' == !false; //false
'abc' != false; // true
打开控制台并亲自检查。还有很多例子。
【讨论】:
请使用 sn-ps - 指导人们“检查自己”是不好的做法。 你有@Azamantes !也许是一个边缘案例,但这绝对有可能发生。 还有 != null
或者[] != null
,或者null != false
、1 != 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 进行某种类型的转换/布尔化,在这种情况下,我可能会通过重构它来引入错误。感谢您的澄清!以上是关于在 Javascript 中,A == !B 是不是始终与 A != B 相同的主要内容,如果未能解决你的问题,请参考以下文章