Javascript 关系运算符显示字符串的奇怪行为

Javascript Relational Operator Showing Weird Behavior with Strings

本文关键字:字符串 关系 运算符 显示 Javascript      更新时间:2023-09-26

为什么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

edit — 这一切都与隐含在 == 运算符行为中的类型转换以及表达式的语法和运算符优先级规则有关。==运算符是左关联运算符,这意味着像这个问题一样的一串==表达式用左加权括号处理(如上图我的答案所示(。

为了分解事情,在第一次比较之后,你得到了

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首先比较number1number2,在这种情况下产生true。 然后它比较结果(true(和number3...这也是正确的,因为true == 1是Javascript中的真实陈述。也就是说,true的数值为 1。(请注意,即使在布尔上下文中,任何非零数的计算结果为真,或者至少是真数也只有数字 1 测试等于true本身。

如果使用 === ,则会得到不同的结果,因为true === 1是假的。 事实上,如果xy不是同一类型的值,则x === y总是假的。

当你到达字符串时,你可以看到即使使用==也不起作用,因为true == s对于大多数字符串s都不正确。 (例外情况是,如果s是数字"1"的字符串表示,那么它首先被转换为数字 1,正如我们上面所说,它测试为==true (。

如果你想比较三件事都相等,你需要比较两对它们和它们一起:

if ((number1 === number2) && (number2 === number3)) {...}

所以,总结一下:如果你将number1和朋友设置为2而不是1,你会在第一个例子中得到false。如果您将string1和朋友设置为"1"而不是"a",则在第二个中会得到true。 如果你使用===而不是==,你可以避免所有的混乱。