簡體   English   中英

Javascript關系運算符顯示字符串異常行為

[英]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首先比較number1number2 ,得出-在這種情況下為true 然后它將結果( true )和number3 ...進行比較,這也是正確的,因為true == 1是Javascript中的true語句。 也就是說, true的數值為1。(請注意,即使在布爾值上下文中任何非零數字都被評估為true或至少為true,但只有數字1會測試其是否等於true 。)

如果使用=== ,則會得到不同的結果,因為true === 1為false。 實際上,如果xy不是同一類型的值,則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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM