2015-07-03 106 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。如果您使用===而不是==,則可以避免所有的混淆。