[英]Javascript Relational Operator Showing Weird Behavior with Strings
为什么在比较三个字符串时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??
这个:
string1 == string2 == string3
手段:
(string1 == string2) == string3
这就是说:
true == string3
那不是true
,所以是false
。
如果要查看三个字符串是否相同,则需要
string1 == string2 && string2 == string3
编辑 -这都与==
运算符的行为中隐含的类型转换以及表达式的语法和运算符优先级规则有关。 ==
运算符是左关联的 ,这意味着此问题中的一串==
表达式将用左加权括号括起来(如我的答案中所示)。
分解一下,在第一次比较之后
true == string3
因此,左侧是布尔值,右侧是字符串。 ==
运算符的规则表明,在这种情况下,您将比较视为布尔值和另一个操作数的数值之间的比较,从而得出
1 == string3
现在我们有了一个数字和一个字符串。 在这种情况下, ==
的规则说将字符串转换为数字,
1 == NaN
当string3
是"a"
。 该比较是在一个数字和另一个数字之间,因此它是一个简单的数值相等测试,结果为false
。 有了所有这些,请注意,如果字符串已经像这样初始化:
var string1 = "1", string2 = "1", string3 = "1";
然后表达
string1 == string2 == string3
会是true
。 同样,也许比原始测试的结果更令人惊讶,
"2" == "2" == "1"
会是true
!
首先,Javascript的最佳实践是避免==
并改用===
。 ==
运算符非常努力-有些人会说太辛苦-提出一种有效的方法来比较其操作数,因此它可以产生一些令人惊讶的结果。
在您的第一个示例中,此代码:
number1 == number2 == number3
实际上被解释为:
(number1 == number2) == number3
也就是说,JavaScript首先比较number1
和number2
,得出-在这种情况下为true
。 然后它将结果( true
)和number3
...进行比较,这也是正确的,因为true == 1
是Javascript中的true语句。 也就是说, true
的数值为1。(请注意,即使在布尔值上下文中任何非零数字都被评估为true或至少为true,但只有数字1会测试其是否等于true
。)
如果使用===
,则会得到不同的结果,因为true === 1
为false。 实际上,如果x
和y
不是同一类型的值,则x === y
始终为false。
到达字符串时,您可以看到即使使用==
也不行,因为true == s
对于大多数字符串s
都不成立。 (例外是,如果s
是数字“ 1”的字符串表示形式,那么它首先被转换为数字1,正如我们上面所说的那样,它测试==
为true
)。
如果要比较三件事都是相等的,则需要比较两对,并将它们与在一起:
if ((number1 === number2) && (number2 === number3)) {...}
因此,总结一下:如果将number1
和friends设置为2而不是1,则在第一个示例中将得到false
。 如果将string1
和friends设置为“ 1”而不是“ a”,则第二个条件为true
。 如果使用===
而不是==
,则可以避免所有混乱。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.