JavaScript:運算子

ziyunfei發表於2012-09-29

  在上一篇文章中,我們講到了JavaScript中的資料型別和型別轉換,今天,我們接著講一下JavaScript中的每個運算子到底是如何進行型別轉換的,下面會依次講解六個最常用的運算子的工作機制:

typeof

  typeof運算子會返回運算元型別的字串表示。主要有兩個需要注意的地方:

  • 未定義或未宣告的變數將會返回"undefined",比如。如果a沒有被宣告,那麼typeof a將會返回"undefined"。
  • typeof在運算元是null或函式的種情況下會"撒謊"。

  除了這些,運算元和對應的型別字串可以從下表查出:

表示式的型別 結果
Undefined "undefined"
Null "object"⚠
Boolean "boolean"
Number "number"
String "string"
Object,不可以被呼叫 "object"
Object,可以被呼叫 "function"⚠

  我標記“⚠”的兩處地方就是上面提到的typeof誤導我們的地方:type of null應該返回"Null",而任意函式的型別應該是"object"。

減法(-)

  將兩邊的運算元都轉換為數字。"8" - true 會被轉換為 8 - 1。的確非常的簡單,不過下面的加法可就不是了。

加法(+)

  加法是JavaScript中最麻煩的運算子了.讓我們看看在執行a + b的時到底發生了什麼:

  1. 兩邊的運算元首先被轉換成原始值.這裡我們稱之為A 和 B。
  2. 如果有任意一個原始值是字串,則把另一個也轉換成字串,執行A和B的連線操作並返回連線後的字串。
  3. 否則把A和B都轉換為數字,返回兩個數字的和。

  例如:

8 + "5" ➙ "8" + "5" ➙ "85";  //"5"是字串,所以把8也轉換成字串,連線後值為"85"
8 + true ➙ 8 + 1 ➙ 9;        //沒有字串,兩邊都轉換成數字,true轉換成數字為1,返回相加的和9
"8" + true ➙ "8" + "true" ➙ "8true";  //"8"是字串,把true也轉換成字串"true",連線後值為"8true"

小於(<)

  和加法運算子不同,小於運算子只在兩個運算元都為字串的時候才將他們作為字串來比較。下面是正式的操作步驟:

  1. 兩邊的運算元都轉換成原始值.這裡我們稱之為A 和 B。
  2. 如果這個兩個原始值都為字串,則把A和B按照字串來比較。
  3. 否則將他們都轉換位數字,按照數字大小比較。

  例如:

8 > "5" ➙ 8 > 5 ➙ true;   //兩邊不都是字串,"5"轉換為數字5
8 > true ➙ 8 > 1 ➙ true;  //兩邊不都是字串,true轉換成數字1
"8" > "18" ➙ true;         //兩邊都是字串,8的ascii碼大於1的ascii碼

嚴格相等(===)

  許多運算子中最讓人省心的一個,也被稱為三等號(===),它的操作很簡單:檢查兩個運算元的型別是否相等,如果相等的話,檢查他們的值是否相等。他的兄弟運算子(==)就比較複雜了。

相等(==)

  JavaScript中最讓人討厭的運算子。它的工作機制是這樣的:

  1. 首先檢查兩個運算元的型別,如果他們是相同的型別,那麼繼續執行嚴格相等比較。
  2. 如果兩個運算元都是null或者是undefined,返回true。
  3. 如果其中一個運算元是字串另外一個是數字,則將他們都轉換數字,再執行嚴格相等比較。
  4. 如果其中一個運算元是布林值,把它轉換成數字,然後回到步驟1繼續執行。
  5. 如果其中一個運算元是字串或者數字,另外一個是物件值,把這個物件值轉換成原始值,然後回到步驟1繼續執行。
  6. 返回false。

  這基本上意味著,如果兩個運算元的型別不同,則判斷的工作機制類似於小於<比較,如果型別相同,則類似於嚴格相等比較。總結一下就是:當型別不同時,將兩個運算元都轉換為原始值,除非兩個原始值都是字串,否則再次將兩個原始值轉換成數字再比較,還有就是null == undefined是true。

8 == "5" ➙ 8 == 5 ➙ false;          //"5"轉換成數字5
1 == true ➙ 1 == 1 ➙ true;          //true轉換成數字1
 
0 == "" ➙ 0 == 0 ➙ true;            //""轉換成數字0
0 == "0" ➙ 0 == 0 ➙ true;           //"0"轉換成數字0
"" == "0" ➙ false;                   //字串直接判斷是否相等
 
"1000" == "1e3" ➙ false;        //字串直接判斷是否相等  
1000 == "1e3" ➙ true;                //"1e3"轉換成1000,科學計數法
5 == {valueOf: function () { return 5; }} ➙ 5 == 5 ➙ true;         //物件值轉換成原始值5

  這六個運算子並不是全部的運算子,但肯定是最麻煩的幾個了。

英文原文:http://blogs.adobe.com/webplatform/2012/09/21/javascript-operators/

相關文章