Javascript 为什么&引用;0";==&引用;0“;这是真的吗?

Javascript 为什么&引用;0";==&引用;0“;这是真的吗?,javascript,Javascript,我正在使用JavaScript,我有一个bug,原因是“0”和!在“then”语句中输入“0”。当我在控制台中尝试时,我看到: !"0" == "0" -> true 为什么会发生这种情况?有人会说,这是javascript。有一个合乎逻辑的解释: !“0”的计算结果为false “0”将被强制转换为0,该值等于false 因为您现在比较的是false和false,所以它们都是相同的。你的比较必须是真实的。有人会说,它的javascript。有一个合乎逻辑的解释: !“0”的计算结

我正在使用JavaScript,我有一个bug,原因是“0”和!在“then”语句中输入“0”。当我在控制台中尝试时,我看到:

!"0" == "0" -> true

为什么会发生这种情况?

有人会说,这是javascript。有一个合乎逻辑的解释:

  • !“0”
    的计算结果为
    false
  • “0”
    将被强制转换为
    0
    ,该值等于
    false

因为您现在比较的是
false
false
,所以它们都是相同的。你的比较必须是真实的。

有人会说,它的javascript。有一个合乎逻辑的解释:

  • !“0”
    的计算结果为
    false
  • “0”
    将被强制转换为
    0
    ,该值等于
    false
因为您现在比较的是
false
false
,所以它们都是相同的。您的比较必须是真实的。

!“0”
“0”
转换为
false
,然后
false
==
转换为
“0”
,因为它们都将转换为整数0。
!“0”
“0”
转换为
false
,然后
false
==
转换为
“0”
,因为它们都将转换为整数0。
!“0”
将字符串
“0”
转换为布尔值,并取其反。因此,由于
“0”
是真实的(唯一错误的字符串是空字符串),因此它的否定值是布尔值
false
。因此,要明确的是:

!“0”
转换为
false

由于我们将布尔值
false
与字符串
“0”
进行比较,javascript将把这两个值转换为数字。请参阅中的表,查看比较时哪些类型转换为哪些类型。您会注意到,对于布尔值和字符串,它们都被更改为数字,然后进行比较

最后,我们有
!“0”
,其计算结果为
false
。然后我们将其与另一个字符串进行比较:
“0”
。因为一个是布尔值,另一个是字符串,所以它们被转换为数字。
false
的数字转换为
0
“0”
的数字转换为
0
,两者相等。因此,我们得到了您看到的结果。

!“0”
将字符串
“0”
转换为布尔值,并取其反。因此,由于
“0”
是真实的(唯一错误的字符串是空字符串),因此它的否定值是布尔值
false
。因此,要明确的是:

!“0”
转换为
false

由于我们将布尔值
false
与字符串
“0”
进行比较,javascript将把这两个值转换为数字。请参阅中的表,查看比较时哪些类型转换为哪些类型。您会注意到,对于布尔值和字符串,它们都被更改为数字,然后进行比较


最后,我们有
!“0”
,其计算结果为
false
。然后我们将其与另一个字符串进行比较:
“0”
。因为一个是布尔值,另一个是字符串,所以它们被转换为数字。
false
的数字转换为
0
“0”
的数字转换为
0
,两者相等。因此,我们得到了您看到的结果。

这就是为什么JavaScript强制非常棘手,特别是在0这个数字是99%的错误原因的情况下,它起到了非常方便的作用

  • 当相等(=)比较应用于两个值时,例如x==y默认情况下,比较值从L->R(从左到右)进行检查

  • 因此,在您的情况下,在Loose(==)相等性被检查之前,(应用否定)结果是!“0”->错误。

  • 现在是强制部分:根据ECMAScriptecma-262规范,它声明

    • 如果类型(x)为布尔值,则返回比较结果!t编号(x)=y

    • 如果类型(y)为布尔值,则返回比较结果x==!汤姆伯(y)

这意味着如果其中一个值是布尔值,就像我们的例子一样

->false==“0”

->数字(假)=“0”

->数字(假)=数字(“0”)

->0==0//将结果转换为真实值

Therefore:
!"0" == "0" -> true

这就是为什么JavaScript强制非常棘手的原因,特别是在0数字(99%是错误原因)的情况下,它起到了非常方便的作用

  • 当相等(=)比较应用于两个值时,例如x==y默认情况下,比较值从L->R(从左到右)进行检查

  • 因此,在您的情况下,在Loose(==)相等性被检查之前,(应用否定)结果是!“0”->错误。

  • 现在是强制部分:根据ECMAScriptecma-262规范,它声明

    • 如果类型(x)为布尔值,则返回比较结果!t编号(x)=y

    • 如果类型(y)为布尔值,则返回比较结果x==!汤姆伯(y)

这意味着如果其中一个值是布尔值,就像我们的例子一样

->false==“0”

->数字(假)=“0”

->数字(假)=数字(“0”)

->0==0//将结果转换为真实值

Therefore:
!"0" == "0" -> true

因为
(!(“0”==“0”))!=((!“0”)==“0”)
。可能重复的可能重复为什么这很重要?这是代码中的实际问题吗?你在别的地方看到这个了吗?如果是,背景是什么?他们没有解释一下这段看似无用的代码吗?因为
(!((“0”==“0”))!=((!“0”)==“0”)