javascript - 为什么 tab 在 JavaScript 中等于 false?

标签 javascript

<分区>

我以为我知道 == 的怪癖以及 JavaScript 中所有奇怪的类型转换,但今天我偶然发现了一件没有任何意义的事情 对我来说:

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

这是为什么?

显然,'\t' 不是假值,如果与 || 结合使用,它会像预期的那样工作:

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

另一方面,toString 也不会在 false 上调用,请参阅:

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

这让我想到选项卡可能会转换为 bool 值,但是:

Boolean('\t') == false
// => false

那么,问题是:这是为什么?

最佳答案

参见 Abstract Equality Comparison: :

The comparison x == y, where x and y are values, produces true or false. Such a comparison is performed as follows:

因此,在您的情况下,x 是一个字符串,y 是一个 bool 值。这里满足的第一个条件是:

  1. If Type(y) is Boolean, return the result of the comparison x == ToNumber(y).

把支票变成

'\t' == 0

然后满足:

  1. If Type(x) is String and Type(y) is Number, return the result of the comparison ToNumber(x) == y.

ToNumber('\t') === 0:

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

把支票变成

0 == 0

相同
0 === 0

为真

请注意,虽然由所有空格组成的字符串是 == false,但在这样的字符串上调用 Boolean 将返回 true,因为该字符串的长度不为零:

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

当然,最好始终避免 == - 使用 === 代替,这样您就不必担心这些愚蠢的强制转换规则。

关于javascript - 为什么 tab 在 JavaScript 中等于 false?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57372554/

相关文章:

javascript - 用两个词而不是一个词对数组进行分组

javascript - 如何在纯 JavaScript 的帮助下对表格进行排序和重新生成

javascript - 分配给组件属性时不执行订阅

javascript - xdk按钮没有任何作用

javascript - 选择兄弟 div jquery 的跨度

javascript - 在javascript中使用嵌套循环遍历数组

javascript - 如何在angular js中将数据从一个页面传递到另一个页面

javascript - Jquery 隐藏从 url 加载的表中未选定的行。

javascript - AJAX 调用 [object%20Object] 而不是 URL (Symfony)

javascript - 使用 JavaScript 从超链接加载时的默认下拉值