我试图在这里理解一些东西,解释自己的最佳方式是举个例子:
"" == false
// true
"0" == false
// true
false == false
// true
但是这里会发生什么?
"" == "0"
// false
如果""
评估为false
且"0"
评估为false
,则逻辑预测它与我写false == false
的内容相同。
我确实意识到我想在这里比较两个字符串,但语言如何知道"a" == "b"
或"" == "0"
之间的区别?在这种情况下如何发生强制?
答案 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" == false
(true
)。
当您将不同数据类型的值与松散比较(==
)进行比较时,它们总是被强制转换为数字(或者可能是字符串,如果您要将对象与字符串进行比较)。
有关比较算法的更多信息,请查看specification。
答案 1 :(得分:1)
两个操作数都被视为字符串(因为""
是一个字符串,"0"
也被视为字符串)所以比较返回false
。
等于(==)
如果两个操作数的类型不同,则JavaScript会转换 操作数然后应用严格的比较。如果任一操作数是一个数字 或者布尔值,如果可能,操作数将转换为数字;其他 如果任一操作数是一个字符串,则另一个操作数转换为a 如果可能的话。如果两个操作数都是对象,那么JavaScript 比较操作数引用时相等的内部引用 内存中的同一个对象。
来自Mozilla开发者网络中的Comparison Operators
答案 2 :(得分:0)
我尝试了你给出的例子,我发现有趣的是0和“”被认为等于假。我知道0表示为假,但我刚才才知道“”。谢谢你。 :)
现在,我尝试的是比较“”== 0,这给了我真实的。所以在这里发生的事情是,由于比较的两个操作数不是相同的数据类型,javascript转换它们(强制发生)并且你自己检查并声明它们都是相同的,即假和假==假是真的。但是当你尝试比较“”==“0”时,围绕它们的双引号会导致它们被视为字符串和字符串它们不相等,因为它们的内容不同。这就是我们在那里弄错的原因。
感谢您提出的问题,这不是最好的,但我尝试并学到了一些东西。 :)
答案 3 :(得分:0)
这是因为Javascript处理相等性检查的方式有些奇怪:您可以使用==
通过隐式类型转换检查值,或使用===
检查类型和值。
这也意味着,如果与false
进行比较,则会将'falsish'值列表评估为==
:""
,0
,undefined
,{{ 1}}
现在:null
正在比较明显不同的两个字符串。
凌乱的问题是为什么"" == "0"
?
这与"0" == false
的{{3}}:
如果两个操作数的类型不同,则JavaScript会转换 操作数然后应用严格的比较。如果任一操作数是一个数字 或者是布尔值,如果可能,操作数将转换为数字;其他 如果任一操作数是一个字符串,则另一个操作数转换为a 如果可能的话。如果两个操作数都是对象,那么JavaScript 比较操作数引用时相等的内部引用 内存中的同一个对象。
当您将==
与布尔值进行比较时,它首先转换为数字"0"
,即'falsish'。将0
与字符串进行比较时,会比较字符串。
如果直接转换(不使用"0"
),则==
的计算结果为true:
"0"
答案 4 :(得分:0)
看看这个规范,
If Type(x) is Boolean, return true if x and y are both true or both false. Otherwise, return false.
这解释了一切。