判斷兩個變量是否相等是程序設計中非常重要的運算,。在處理原始值時,,這種運算相當簡單,但涉及對象,,任務就稍有點復雜,。
ECMAScript 提供了兩套等性運算符:等號和非等號用于處理原始值,全等號和非全等號用于處理對象,。
等號和非等號
在 ECMAScript 中,,等號由雙等號(==)表示,當且僅當兩個運算數(shù)相等時,,它返回 true,。非等號由感嘆號加等號(!=)表示,當且僅當兩個運算數(shù)不相等時,,它返回 true,。為確定兩個運算數(shù)是否相等,,這兩個運算符都會進行類型轉換。
執(zhí)行類型轉換的規(guī)則如下:
- 如果一個運算數(shù)是 Boolean 值,,在檢查相等性之前,,把它轉換成數(shù)字值。false 轉換成 0,,true 為 1,。
- 如果一個運算數(shù)是字符串,另一個是數(shù)字,,在檢查相等性之前,,要嘗試把字符串轉換成數(shù)字。
- 如果一個運算數(shù)是對象,,另一個是字符串,,在檢查相等性之前,要嘗試把對象轉換成字符串,。
- 如果一個運算數(shù)是對象,,另一個是數(shù)字,在檢查相等性之前,,要嘗試把對象轉換成數(shù)字,。
在比較時,該運算符還遵守下列規(guī)則:
- 值 null 和 undefined 相等,。
- 在檢查相等性時,,不能把 null 和 undefined 轉換成其他值。
- 如果某個運算數(shù)是 NaN,,等號將返回 false,,非等號將返回 true。
- 如果兩個運算數(shù)都是對象,,那么比較的是它們的引用值,。如果兩個運算數(shù)指向同一對象,那么等號返回 true,,否則兩個運算數(shù)不等,。
重要提示:即使兩個數(shù)都是 NaN,等號仍然返回 false,,因為根據(jù)規(guī)則,,NaN 不等于 NaN。
下表列出了一些特殊情況,,以及它們的結果:
表達式 | 值 |
null == undefined |
true |
"NaN" == NaN |
false |
5 == NaN |
false |
NaN == NaN |
false |
NaN != NaN |
true |
false == 0 |
true |
true == 1 |
true |
true == 2 |
false |
undefined == 0 |
false |
null == 0 |
false |
"5" == 5 |
true |
全等號和非全等號
等號和非等號的同類運算符是全等號和非全等號,。這兩個運算符所做的與等號和非等號相同,只是它們在檢查相等性前,,不執(zhí)行類型轉換,。
全等號由三個等號表示(===),,只有在無需類型轉換運算數(shù)就相等的情況下,才返回 true,。
例如:
var sNum = "66";
var iNum = 66;
alert(sNum == iNum); //輸出 "true"
alert(sNum === iNum); //輸出 "false"
在這段代碼中,,第一個 alert 使用等號來比較字符串 "66" 和數(shù)字 66,輸出 "true",。如前所述,,這是因為字符串 "66" 將被轉換成數(shù)字 66,,,然后才與另一個數(shù)字 66 進行比較,。第二個 alert 使用全等號在沒有類型轉換的情況下比較字符串和數(shù)字,當然,,字符串不等于數(shù)字,,所以輸出 "false"。
非全等號由感嘆號加兩個等號(!==)表示,,只有在無需類型轉換運算數(shù)不相等的情況下,,才返回 true。
例如:
var sNum = "66";
var iNum = 66;
alert(sNum != iNum); //輸出 "false"
alert(sNum !== iNum); //輸出 "true"
這里,,第一個 alert 使用非等號,,把字符串 "66" 轉換成數(shù)字 66,,使得它與第二個運算數(shù) 66 相等,。因此,計算結果為 "false",,因為兩個運算數(shù)是相等的,。第二個 alert 使用的非全等號。該運算是在問:"sNum" 與 "iNum" 不同嗎,?這個問題的答案是:是的(true),,因為 sNum 是字符串,而 iNum 是數(shù)字,,它們當然不同,。
|