2015-07-03 83 views
1

为什么Javascript关系运算符在比较三个字符串时显示奇怪的结果?我错了还是Javascript有buggy?JavaScript关系运算符显示奇怪行为与字符串

var number1 = 1 
var number2 = 1 
var number3 = 1 
number1 == number2 //true 
number1 == number3 //true 
number2 == number3 //true 
number1 == number2 == number3 //true. Good! 

现在problemetic部分:

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?? 

回答

6

此:

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

+0

并使用equals() – djechlin

+1

@djechlin这是一个JavaScript问题,而不是Java – Pointy

+0

@Pointy我在想同样的事情,但我想知道为什么它不与数字相同?这是我的实际问题。 –

2

首先,Javascript中的最佳做法是避免==并使用===代替。 ==运营商非常努力地尝试 - 有些人会说太难 - 想出一个有效的方式来比较它的操作数,所以它可以产生一些令人惊讶的结果。

在你的第一个例子,这个代码:

number1 == number2 == number3 

实际上被解释为这样的:

(number1 == number2) == number3 

也就是说,使用Javascript首先比较number1number2,产生 - 在这种情况下 - true。然后比较结果(true)和number3 ...这也是是真的,因为true == 1是在Javascript中的一个真实的语句。也就是说,true具有1的数字值(请注意,即使任何非零数字1个测试作为等于评估为真,或至少truthy,在布尔上下文中,只数true本身。)

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

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

如果你想比较这三两件事都彼此相等,则需要比较两个对他们来说,并和他们一起:

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

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