根据this table in the ECMAScript standard,长度为0的字符串值应评估为布尔值false
。
那么,为什么这些陈述会评估为true
?
"\t" == false
" " == false
"\n" == false
" " == false
所有这些字符串的长度都大于0.例如:
虽然我理解"0"
评估为false
,因为它可以强制为数字0
,但我无法解释为什么这些字符串是假的。发生了什么事?
(显然我可以使用===
进行严格的比较,但在我的代码中,我需要进行宽松的比较,但是我并不期望非空字符串被认为是假的。 )
答案 0 :(得分:9)
您正在使用松散比较,执行类型转换。每当您与布尔值进行比较时,两个值实际上都会转换为数字(spec, steps 7 and 5)。 false
为0
并且(令人惊讶!)每个仅包含空格字符的字符串也会转换为0
(转换为数字时)(spec):
StringNumericLiteral ::: StrWhiteSpace
的MV是0
。
我没想到非空字符串被认为是假的
比较值与布尔值非常不同,将值转换为布尔值。 “Falsy”表示转换为布尔值时,该值将转换为false
。但是,在您的情况下,首先将值转换为数字。
示例:
Number(" ") // 0 ( == Number(false))
// vs
Boolean(" ") // true