为什么在JavaScript中tab等于false?

42

我以为自己对于JavaScript中的==和各种奇怪的类型转换很了解,但今天我发现了一件让我完全无法理解的事情:

'\t' == false
// => true

为什么会这样呢?

显然,'\t' 不是假值,如果与 || 结合使用,它将按预期工作:

'\t' || 42
// => '\t'

另一方面,false 不会调用 toString 方法,如下所示:
'\t' == 'false'
// => false

这让我想到可能会将tab转换为布尔值,但是:
Boolean('\t') == false
// => false

所以,问题是:为什么会这样?

2
  1. Javascript的true和false看起来有点奇怪。
  2. 这主要是因为空格是制表符,从使用案例的角度来看,通常不会将空字符串视为具有值的单词。想象一下有一个输入掩码,然后您可以通过执行if(inputstirng){...}来检查它是否有值。
- jonathan Heindl
'\n' == false 也是真的。 - GrafiCode
"\t" 是一个空字符串。 - Estradiaz
4
@jonathanHeindl 的意思是:JavaScript 不仅在布尔值方面表现奇怪,还有其他方面也很奇怪。 - Eric Duminil
1个回答

42
请参考抽象相等比较:,比较表达式x == y(其中x和y是值)会产生true或false。该比较如下进行:在您的情况中,x是一个字符串,而y是一个布尔值。这里满足的第一个条件是:

如果Type(y)是Boolean,则返回比较结果x == ToNumber(y)

将检查转换为:
'\t' == 0

然后就可以实现以下要求:

  1. 如果x的类型是字符串,y的类型是数字,则返回比较结果:ToNumber(x) == y。

而且,ToNumber('\t') === 0

console.log(Number('\t'));

将检查转换为
0 == 0

这与

0 === 0

或者true

请注意,虽然由所有空白组成的字符串== false,但在这样的字符串上调用布尔值将返回true,因为字符串具有非零长度:

console.log(
  Boolean(' '),
  Boolean('\t')
);

当然,最好总是避免使用 == - 而是使用 ===,这样你就不必担心这些愚蠢的强制转换规则了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接