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

时间:2015-07-03 14:56:49

标签: javascript

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

2 个答案:

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

如果您使用===,则会得到不同的结果,因为true === 1为false。实际上,如果x === yx不是同一类型的值,则y始终为false。

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

如果你想比较三件事情都是彼此相等的,你需要比较它们的两对和AND它们在一起:

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

因此,总结一下:如果您将number1和朋友设置为2而不是1,则在第一个示例中获得false。如果您将string1和朋友设置为" 1"而不是" a",在第二个中得到true。如果您使用===代替==,则可以避免所有混淆。