[英]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.