我正在使用JavaScript而且我遇到了这个错误,原因是" 0"和!" 0"输入"然后"句子。当我在控制台中尝试时,我看到了:
!"0" == "0" -> true
为什么会这样?
答案 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
由于您现在正在比较false
和false
,因此它们都是相同的。你的比较必须是真实的。
答案 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