我已经检查了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'
这是错误的,因为当布尔值与其他东西进行比较时,根据规范:
- 如果 Type(x) 是布尔值,则返回比较结果!ToNumber(x) == y.
当右侧是字符串时,这将解析为
1 == 'some string'
然后运行
如果 Type(x) 是
- 数字,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"。