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

why checking equality between three strings not works but between three numbers does?

提问人:Pouria Moosavi 提问时间:10/22/2019 更新时间:10/22/2019 访问量:56

问:

我已经在 javascript 中检查了三个数字之间的相等性,它有效。喜欢:

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

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

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

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

JavaScript 比较 相等性

评论

1赞 georg 10/22/2019
喜欢这个:1 == 1 == 1 -> 1 == true -> 1 == 1 -> true
0赞 Bravo 10/22/2019
(x == x) 是 或 ...所以第三件事最好是真或假truefalse
2赞 georg 10/22/2019
另外,永远不要在 javascript 中使用!==
0赞 Bravo 10/22/2019
@georg - 除非在适当的情况下
1赞 georg 10/22/2019
@Bravo:这是,永远不要;)

答:

4赞 CertainPerformance 10/22/2019 #1

因为

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

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

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

这是

true == 'some string'

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

  1. 如果 Type(x) 为 Boolean,则返回比较结果!ToNumber(x) == y。

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

1 == 'some string'

然后运行

  1. 如果 Type(x) 为 Number 且 Type(y) 为 String,则返回比较结果 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赞 Amit 10/22/2019 #2

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