官术网_书友最值得收藏!

3.5 ECMAScript等性運算符及表達式

在ECMAScript語法中,判斷兩個變量是否相等的運算符,統稱為等性運算符。等性運算符一般包括等號、非等號、全等號和非全等號這幾種。其中,等號和非等號用于處理原始值,而全等號和非全等號主要用于處理對象。等性運算符表達式均會返回一個布爾值。下面對這些等性運算符逐一進行介紹。

3.5.1 等性運算符與表達式概述

關于ECMAScript語法中定義的等性運算符的內容詳見表3-5。

表3-5 ECMAScript等性運算符與表達式

3.5.2 等號與非等號運算符表達式

在ECMAScript語法定義中,等號是用雙等號(==)來表示的,其含義是當且僅當兩個運算數相等時返回布爾值true,否則返回布爾值false。而非等號是用感嘆號(!)和等號(=)的組合(!=)來表示的,其含義是當且僅當兩個運算數不相等時,返回布爾值true,否則返回布爾值false。

為確定兩個運算數是否相等,運算前均會對這兩個運算數進行類型轉換。執行類型轉換的基本規則如下:

  • 如果一個運算數是Boolean值,在比較是否相等之前,會將其轉換成相應數值,具體是false轉換成0,true轉換為1;
  • 如果一個運算數是字符串(一般指數值型字符串,比如:"123"等),另一個是數字,在比較是否相等之前,會將其轉換成數值;
  • 如果一個運算數是對象,而另一個是字符串,則在比較是否相等之前,會將該對象轉換成字符串;
  • 如果一個運算數是對象,而另一個是數值,則在比較是否相等之前,會將該對象轉換成數值。

而在比較運算時,等號與非等號運算符還會遵循以下規則:

  • 原始值null和undefined是相等的;
  • 在比較是否相等,不能把原始值null和undefined轉換成其他值;
  • 如果有一個運算數是NaN,則等號運算符將返回false,非等號運算符將返回true;
  • 如果兩個運算數都是對象,那么比較的是各自的引用值;
  • 如果兩個運算數指向同一對象,那么等號運算符會返回true。

下面,來看一個等號與非等號運算符表達式的代碼示例(詳見源代碼ch03目錄中ch03-js-operator-equal.html文件)。

【代碼3-16】

   01  <script type="text/javascript">
   02       var bR_1_1 = 1 == 2;
   03       console.log("1 == 2 = " + bR_1_1);
   04       var bR_1_0 = 1 != 2;
   05       console.log("1 != 2 = " + bR_1_0);
   06       var bR_2_0 = false == 0;
   07       console.log("false == 0 = " + bR_2_0);
   08       var bR_2_1 = true == 1;
   09       console.log("true == 1 = " + bR_2_1);
   10       var bR_2_2 = true == 2;
   11       console.log("true == 2 = " + bR_2_2);
   12       var bR_3 = "1" == 1;
   13       console.log("'1' == 1 = " + bR_3);
   14       var bR_4 = null == 0;
   15       console.log("null == 0 = " + bR_4);
   16       var bR_5 = undefined == 0;
   17       console.log("undefined == 0 = " + bR_5);
   18       var bR_6 = undefined == null;
   19       console.log("undefined == null = " + bR_6);
   20       var bR_7 = NaN == 1;
   21       console.log("NaN == 1 = " + bR_7);
   22       var bR_8 = NaN == NaN;
   23       console.log("NaN == NaN = " + bR_8);
   24       var bR_9 = NaN != NaN;
   25       console.log("NaN != NaN = " + bR_9);
   26       var bR_10 = "NaN" == NaN;
   27       console.log("'NaN' == NaN = " + bR_10);
   28  </script>

關于【代碼3-16】的分析如下:

這段代碼主要就是對數值、字符串、null、undefined和NaN等原始值分別使用了等號(==)和非等號(!=)運算符進行比較運算,具體為數值與數值、數值與字符串、null與undefined、NaN與數值和NaN與自身等進行比較運算。

頁面效果如圖3.18所示。

圖3.18 ECMAScript等性運算符(等號與非等號)

從第03行和第05行代碼輸出的結果來看,等號和非等號運算符可用于判斷兩個運算數是否相等;

從第07行和第09行代碼輸出的結果來看,在對true和false進行等性運算時,會先將true轉換為數值1,將false轉換為數值0,然后進行比較;因此,第07行和第09行代碼輸出的結果都為true,而第11行代碼輸出的結果為false;

從第13行代碼輸出的結果來看,在對字符串和數值進行等性運算時,會將字符串先轉換成數值,再與另一個數值進行比較;因此,第13行代碼輸出的結果為true;

從第15行和第17行代碼輸出的結果來看,null和undefined在與數值進行等性運算時,這兩個原始值是不能轉換為數值的;但從第19行代碼輸出的結果來看,在對null和undefined進行等性運算時(null == undefined),返回的結果為true,也就是說null和undefined的值是相等的;

從第21行、第23行、第25行和第27行代碼輸出的結果來看,原始值NaN不但與數值進行等性運算時是不相等的,且與自身進行等性運算時(NaN == NaN、"NaN" == NaN)也是不相等的;這一點也是符合ECMAScript語法中對NaN的定義。

以上就是對等號(==)和非等號(!=)運算符的測試,尤其是對原始值null、undefined和NaN的測試結果需要特別注意,希望讀者多加練習、進一步理解等性運算符的使用方法。

3.5.3 全等號與非全等號運算符表達式

在ECMAScript語法定義中,全等號、非全等號與等號、非等號是同類運算符,不同之處在于進行比較運算之前全等和非全等運算符不會對兩個運算數進行類型轉換。

ECMAScript語法規定,全等號使用三個等號(===)來表示,其只有在無須類型轉換,運算數就相等的條件下,返回值才會為true。而非全等號使用感嘆號(!)和兩個等號(==)的組合(!==)來表示,其只有在無須類型轉換,運算數就不相等的條件下,返回值才會為true。

通過對前一小節的學習,我們知道等號與非等號運算時會對運算數進行類型轉換。而全等號與非全等號運算前對運算數不進行類型轉換,該功能自然有其存在的意義。

下面,來看一個全等號與非全等號運算符表達式的代碼示例(詳見源代碼ch03目錄中ch03-js-operator-identi-equal.html文件)。

【代碼3-17】

   01  <script type="text/javascript">
   02       var iNum = 123;
   03       var iStr = "123";
   04       console.log("123 == '123' = " + (iNum == iStr));
   05       console.log("123 === '123' = " + (iNum === iStr));
   06       console.log("123 != '123' = " + (iNum != iStr));
   07       console.log("123 !== '123' = " + (iNum !== iStr));
   08       var bR_1_1 = null == undefined;
   09       console.log("null == undefined = " + bR_1_1);
   10       var bR_1_2 = null === undefined;
   11       console.log("null === undefined = " + bR_1_2);
   12       var bR_2_1 =  null != undefined;
   13       console.log("null != undefined = " + bR_2_1);
   14       var bR_2_2 = null !== undefined;
   15       console.log("null !== undefined = " + bR_2_2);
   16       var bR_NaN_1 = NaN == NaN;
   17       console.log("NaN == NaN = " + bR_NaN_1);
   18       var bR_NaN_2 = NaN === NaN;
   19       console.log("NaN === NaN = " + bR_NaN_2);
   20  </script>

關于【代碼3-17】的分析如下:

這段代碼主要就是對數值、字符串、null、undefined和NaN等原始值分別使用了全等號(===)和非全等號(!==)運算符進行了比較運算。

第02~03行代碼分別定義了兩個變量(iNum和iStr),其中變量(iNum)初始化為數值123,而變量(iStr)初始化為數值型字符串"123";

第04~07行代碼分別使用等號(==)、非等號(!=)、全等號(===)和非全等號(!==)運算符對變量(iNum)和變量(iStr)進行了比較運算;

第08~15行代碼分別使用等號(==)、非等號(!=)、全等號(===)和非全等號(!==)運算符對原始值null和undefined進行了比較運算;

第16~19行代碼分別使用等號(==)和全等號(===)運算符,對NaN進行比較運算。

頁面效果如圖3.19所示。

圖3.19 ECMAScript等性運算符(全等號與非全等號)

從第04行和第05行代碼輸出的結果來看,使用等號和全等號運算符對123和"123"的比較運算結果是不同的,原因就是前文中提到的,全等于運算符不會對運算數進行類型轉換,自然數字123和字符串"123"是不相等的;

那么從第06行和第07行代碼輸出的結果來看,使用非等號和非全等號運算符對123和"123"的比較運算結果與使用等號和全等號運算符返回的結果正好相反;

第09行代碼使用等號的輸出結果我們在【代碼3-16】的解釋中已經介紹,而與之相對應的是第11行代碼,使用全等號的輸出的結果正好與之相反,即表達式(null === undefined)的返回值為false;

從第13行和第15行代碼輸出的結果來看,使用非等號和非全等號運算符對null和undefined的比較結果與使用等號和全等號運算符返回的結果正好相反;

最后,從第17行和第19行代碼輸出的結果來看,對于原始值NaN與其自身,無論是使用等號還是全等號進行比較運算,返回后結果均為false,這一點也是符合ECMAScript語法中對NaN的定義。

以上就是對全等號(===)和非全等于(!==)運算符的測試,尤其是對原始值null、undefined和NaN的測試過程需要特別注意,希望能幫助讀者加深領會等性運算符的使用特點。

主站蜘蛛池模板: 北票市| 遂昌县| 两当县| 崇文区| 积石山| 金川县| 桦南县| 元氏县| 万盛区| 新绛县| 英吉沙县| 利辛县| 天柱县| 崇左市| 平利县| 栾川县| 湟中县| 南岸区| 武定县| 阳曲县| 罗山县| 宁明县| 瑞丽市| 武强县| 五莲县| 遂宁市| 西昌市| 海口市| 上思县| 子洲县| 青铜峡市| 普洱| 广宗县| 时尚| 弋阳县| 闽清县| 南昌县| 长岛县| 吴江市| 敖汉旗| 唐山市|