为什么“”==“0”在javascript中是假的?

时间:2014-02-19 18:34:26

标签: javascript

我试图在这里理解一些东西,解释自己的最佳方式是举个例子:

"" == false
// true

"0" == false
// true

false == false
// true

但是这里会发生什么?

"" == "0"
// false 

如果""评估为false"0"评估为false,则逻辑预测它与我写false == false的内容相同。

我确实意识到我想在这里比较两个字符串,但语言如何知道"a" == "b""" == "0"之间的区别?在这种情况下如何发生强制?

5 个答案:

答案 0 :(得分:12)

  

为什么“”==“0”在javascript中为false?

因为操作数是两个具有不同内容的字符串。仅当操作数的数据类型不同时才会发生类型强制。

相关问题:


  

如果""评估为false且"0"评估为false,则逻辑预测它与我写false == false

相同

让我们看看比较实际是如何解决的:

"" == false被强制执行0 == 0

"0" == false被强制执行0 == 0

false == false:相同的数据类型,因此直接比较值

正如您所看到的,"0"没有“评估”到false,它会转换为整数, 值会被比较。 (""评估为false(空字符串),但转换为数字时,0)。

值转换为布尔值并将值与布尔值进行比较之间存在很大差异。最明显的例子:!!"0"true)和"0" == falsetrue)。

当您将不同数据类型的值与松散比较(==)进行比较时,它们总是被强制转换为数字(或者可能是字符串,如果您要将对象与字符串进行比较)。

有关比较算法的更多信息,请查看specification

答案 1 :(得分:1)

两个操作数都被视为字符串(因为""是一个字符串,"0"也被视为字符串)所以比较返回false

  

等于(==)

     

如果两个操作数的类型不同,则JavaScript会转换   操作数然后应用严格的比较。如果任一操作数是一个数字   或者布尔值,如果可能,操作数将转换为数字;其他   如果任一操作数是一个字符串,则另一个操作数转换为a   如果可能的话。如果两个操作数都是对象,那么JavaScript   比较操作数引用时相等的内部引用   内存中的同一个对象。

来自Mozilla开发者网络中的Comparison Operators

答案 2 :(得分:0)

我尝试了你给出的例子,我发现有趣的是0和“”被认为等于假。我知道0表示为假,但我刚才才知道“”。谢谢你。 :)

现在,我尝试的是比较“”== 0,这给了我真实的。所以在这里发生的事情是,由于比较的两个操作数不是相同的数据类型,javascript转换它们(强制发生)并且你自己检查并声明它们都是相同的,即假和假==假是真的。但是当你尝试比较“”==“0”时,围绕它们的双引号会导致它们被视为字符串和字符串它们不相等,因为它们的内容不同。这就是我们在那里弄错的原因。

感谢您提出的问题,这不是最好的,但我尝试并学到了一些东西。 :)

答案 3 :(得分:0)

这是因为Javascript处理相等性检查的方式有些奇怪:您可以使用==通过隐式类型转换检查值,或使用===检查类型和值。

这也意味着,如果与false进行比较,则会将'falsish'值列表评估为==""0undefined,{{ 1}}

现在:null正在比较明显不同的两个字符串。

凌乱的问题是为什么"" == "0"

这与"0" == false的{​​{3}}:

有关
  

如果两个操作数的类型不同,则JavaScript会转换   操作数然后应用严格的比较。如果任一操作数是一个数字   或者是布尔值,如果可能,操作数将转换为数字;其他   如果任一操作数是一个字符串,则另一个操作数转换为a   如果可能的话。如果两个操作数都是对象,那么JavaScript   比较操作数引用时相等的内部引用   内存中的同一个对象。

当您将==与布尔值进行比较时,它首先转换为数字"0",即'falsish'。将0与字符串进行比较时,会比较字符串。

如果直接转换(不使用"0"),则==的计算结果为true:

"0"

答案 4 :(得分:0)

看看这个规范,

http://es5.github.io/#x11.9.3

If Type(x) is Boolean, return true if x and y are both true or both false. Otherwise, return false.

这解释了一切。