根据我的理解,问题已全部解决!! false = false
然后,如果
0 == false // true
'0' == false // true
为什么
!!0 == false
!!'0' == true
答案 0 :(得分:1)
字符串零('0')是真实值
!!'0' == true
!'0' -> !false -> true
所以你实际上在做
true == true
答案 1 :(得分:0)
您似乎偶然发现了===
运算符的重要性。
'0' == false; // true
'0' === false; // false
Boolean('0'); // true
typeof('0'); // string
typeof(!'0'); // boolean
!'0' === false; // true
!!'0' === false // false
答案 2 :(得分:-1)
第一个否定通过调用抽象函数'0'
将字符串ToBoolean
转换为布尔值。根据{{1}} specification,只有7个值被评估/强制/转换为false,即是虚假的:
JavaScript
,null
,undefined
,空字符串,NaN
,+0
和-0
。
因此,false
被评估为真,'0'
被评估为!'0'
,false
被评估为真。
PS :OP在原始注释之后的以下注释中提出了另一种情况,为什么将!!'0'
评估为'0' == false
。即使与原始帖子无关,这里也有解释:
在规范中,第Abstract Equality Comparison节内容为:“ 在评估true
时,如果x == y
的类型为y
,请首先转换Boolean
到y
,然后再次进行比较”。
因此,Number
被评估为Number(false)
。在下一次比较中,将字符串0
与数字'0'
(即0
)进行比较。规范说将字符串转换为数字,然后再次进行比较:'0' == 0
。