为什么检查三个字符串之间的相等性不起作用,但三个数字之间的相等性却有效?



我已经检查了javascript中三个数字之间的相等性,它可以工作。

1 == 1 == 1 //true
2 == 3 == 4 //false
2 == 3 == 3 //false

但是当我尝试在三个字符串之间进行此检查时,它不起作用:

'some string' == 'some string' == 'some string' //false
'a' == 'a' == 'a' //false

有谁知道为什么会这样?
提前谢谢。

因为

'some string' == 'some string' == 'some string'

按从左到右的顺序计算==运算符。相当于

('some string' == 'some string') == 'some string'

这是

true == 'some string'

这是错误的,因为当布尔值与其他东西进行比较时,根据规范:

  1. 如果 Type(x) 是布尔值,则返回比较结果!ToNumber(x) == y.

当右侧是字符串时,这将解析为

1 == 'some string'

然后运行

    如果 Type(x) 是
  1. 数字,Type(y) 是字符串,则返回比较结果 x == !ToNumber(y)。

ToNumber('some string')NaN

console.log(Number('some string'));

所以比较的计算结果是false.

另一方面,使用1 == 1 == 1,遵循相同的过程:

1 == 1 == 1
(1 == 1) == 1
true == 1
// Rule 8, turn left side into a number:
1 == 1
true

结论:始终使用===。如果使用==,则会遇到奇怪的行为。

1 == 1 == 1 可以解释为 (1 == 1(true) == 1),这是真的。 但是 'a' == 'a' == 'a' 会被解释为 ('a' == 'a' (true) == 'a'),这将是假的。因为 true 不等于"a"。

最新更新