为什么!" 0" ==" 0"是真的?

时间:2018-01-22 17:47:38

标签: javascript

我正在使用JavaScript而且我遇到了这个错误,原因是" 0"和!" 0"输入"然后"句子。当我在控制台中尝试时,我看到了:

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

为什么会这样?

4 个答案:

答案 0 :(得分:3)

!"0"将字符串"0"转换为布尔值,并将其否定。因此,"0"是真实的(唯一的假字符串是空字符串),它的否定是布尔值false。所以要明确:

!"0"已转换为false

由于我们将布尔值false与字符串"0"进行比较,因此javascript 会将两个值都转换为数字。请参阅this documentation中的表格,了解哪些类型在比较时会转换为什么类型。您会注意到,对于布尔值和字符串,两者都会更改为数字然后进行比较。

结束时,我们有!"0",评估为false。然后我们将其与其他字符串进行比较:"0"。因为一个是布尔值,另一个是字符串,所以它们被转换为数字。 false的转化次数为0"0"的转化次数为0,相等。因此,我们得到你看到的结果。

答案 1 :(得分:0)

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

  • !"0"评估为false
  • "0"将投放到0,等于false

由于您现在正在比较falsefalse,因此它们都是相同的。你的比较必须是真实的。

答案 2 :(得分:0)

这就是为什么JavaScript强制性很棘手并且特别在出现 0 数字(这是引起错误的99%)的情况下非常有用的原因。

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

  • 因此,在您检查宽松的(==)相等性之前,(应用了否定)会导致 !” 0“ ->否。

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

    • 如果Type(x)为Boolean,则返回比较结果! ToNumber(x)== y。

      OR

    • 如果Type(y)为Boolean,则返回比较结果x ==! ToNumber(y)。

这意味着是否像我们的情况一样,其中一个值都是布尔值

-> false ==“ 0”

-> Number(false)==“ 0”

-> Number(false)== Number(“ 0”)

-> 0 == 0 //结果为真实值;

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

答案 3 :(得分:-1)

!"0"会将"0"转换为false,然后false==转换为"0",因为它们都将转换为整数0 。 https://stackoverflow.com/a/7615326/4949918

相关问题