为什么Javascript关系运算符在比较三个字符串时会显示奇怪的结果?我错了还是Javascript有错误?
var number1 = 1
var number2 = 1
var number3 = 1
number1 == number2 //true
number1 == number3 //true
number2 == number3 //true
number1 == number2 == number3 //true. Good!
现在问题部分:
var string1 = "a"
var string2 = "a"
var string3 = "a"
string1 == string2 //true
string2 == string3 //true
string1 == string3 //true
为什么下面的内容是假的?
string1 == string2 == string3 //false. WHY IS THAT??
答案 0 :(得分:6)
此:
string1 == string2 == string3
表示:
(string1 == string2) == string3
也就是说:
true == string3
那不是true
,所以false
。
如果您想查看三个字符串是否完全相同,则需要
string1 == string2 && string2 == string3
编辑 - 这一切都与==
运算符的行为中隐含的类型转换,以及表达式的语法和运算符优先级的规则有关。 ==
运算符是左关联,这意味着此问题中的==
个表达式字符串使用左加权括号处理(如上面的答案中所示)。
在第一次比较之后,你要解决问题
true == string3
左侧有一个布尔值,右侧有一个字符串。 ==
运算符的规则说,在这种情况下,您将比较视为布尔值和另一个操作数的 numeric 值之间的比较,这给出了
1 == string3
现在我们有了一个数字和一个字符串。在那个的情况下,==
的规则说将字符串转换为数字,这给出了
1 == NaN
当string3
为"a"
时。该比较在数字和另一个数字之间,因此它是一个简单的数字相等测试,结果为false
。考虑到所有这些,请注意,如果字符串已经初始化如下:
var string1 = "1", string2 = "1", string3 = "1";
然后是表达式
string1 == string2 == string3
将是true
。同样地,也许比原始测试的结果更令人惊讶,
"2" == "2" == "1"
将是true
!
答案 1 :(得分:2)
首先,Javascript中的最佳做法是避免使用==
并使用===
。 ==
运算符非常努力 - 有些人会说太难 - 想出一种比较其操作数的有效方法,因此它可以产生一些令人惊讶的结果。
在您的第一个示例中,此代码:
number1 == number2 == number3
实际上解释为:
(number1 == number2) == number3
也就是说,Javascript首先比较number1
和number2
,在这种情况下产生 - true
。然后它会比较结果(true
)和number3
... 也为true,因为true == 1
是Javascript中的真实语句。也就是说,true
的数值为1.(请注意,即使任何非零数字的计算结果为true,或者至少在布尔上下文中为truthy,但只有数字1测试为等于true
本身。)
如果您使用===
,则会得到不同的结果,因为true === 1
为false。实际上,如果x === y
和x
不是同一类型的值,则y
始终为false。
当您到达字符串时,您可以看到即使使用==
这也不会起作用,因为对于大多数字符串true == s
而言s
不正确。 (例外情况是s
是数字" 1"的字符串表示,因为它首先被转换为数字1,正如我们上面所说的那样测试为==
true
)。
如果你想比较三件事情都是彼此相等的,你需要比较它们的两对和AND它们在一起:
if ((number1 === number2) && (number2 === number3)) {...}
因此,总结一下:如果您将number1
和朋友设置为2而不是1,则在第一个示例中获得false
。如果您将string1
和朋友设置为" 1"而不是" a",在第二个中得到true
。如果您使用===
代替==
,则可以避免所有混淆。