为什么有些非空字符串会被评估为" false"在JavaScript?

时间:2014-11-19 20:04:44

标签: javascript type-coercion

根据this table in the ECMAScript standard,长度为0的字符串值应评估为布尔值false

那么,为什么这些陈述会评估为true

"\t" == false
" " == false
"\n" == false
"     " == false

所有这些字符串的长度都大于0.例如:

Not falsey

虽然我理解"0"评估为false,因为它可以强制为数字0,但我无法解释为什么这些字符串是假的。发生了什么事?

(显然我可以使用===进行严格的比较,但在我的代码中,我需要进行宽松的比较,但是我并不期望非空字符串被认为是假的。 )

1 个答案:

答案 0 :(得分:9)

您正在使用松散比较,执行类型转换。每当您与布尔值进行比较时,两个值实际上都会转换为数字(spec, steps 7 and 5)。 false0并且(令人惊讶!)每个仅包含空格字符的字符串也会转换为0(转换为数字时)(spec):

  

StringNumericLiteral ::: StrWhiteSpace的MV是0


  

我没想到非空字符串被认为是假的

比较值与布尔值非常不同,值转换为布尔值。 “Falsy”表示转换为布尔值时,该值将转换为false。但是,在您的情况下,首先将值转换为数字。

示例:

Number("    ") // 0 ( == Number(false))
// vs
Boolean("    ") // true