Javascript數據類型轉換規則

jopen 9年前發布 | 12K 次閱讀 JavaScript開發 JavaScript

前言

Javascript有7種數據類型,包括5種原始類型(也叫原始值)number、Boolean、string、null、 undefined和2種復合類型object、array,它們之間可以根據某種規則相互轉換。《Javascript權威指南》列出了在 Javascript中如何進行類型轉換,如下表:

Javascript數據類型轉換規則

其中原始值之間的轉換沒什么可說的,記住就好了,我們要關注的是復合值(即對象)與原始值之間的轉換。原始值轉換成對象直接調用Object()方法即可(null和undefined不可調用該方法),而對象轉換成原始值呢?如空數組[]轉換成數字為什么是0呢?

對象轉換成原始值

對象轉換成布爾值: 所有對象轉換成布爾值都是true ,包括包裝對象new Boolean(false)轉換成布爾值也是true。

對象轉換成字符串:如果對象有toString()方法,則調用這個方法,如果它返回原始值,將原始值轉換成字符串后返回;如果對象沒有 toString()方法或調用toString()方法方法返回的不是原始值,則調用valueOf()方法,然后將valueOf()方法返回的原始 值轉換成字符串返回,如果valueOf()方法返回的還不是原始值,沒救了,瀏覽器只好拋出類型異常的錯誤。

對象轉換成數字:和對象轉換成字符串過程類似,只不過先調的是valueOf()方法。

根據以上規則就可以知道為什么空數組轉換成數字結果是0了:空數組先調用了valueOf()方法,返回了“”字符串,“”字符串是個原始值,再根據上面的表格,“”字符串轉換成數字0。

隱式類型轉換

來看一個例子:

"123" == 123

大家都知道結果是true,==運算符兩邊的操作數屬于不同的數據類型,要判斷是否相等,需要經過隱式類型轉換成相同的數據類型才行。然而,是運算符左邊的“123”轉換成了數字123還是運算符右邊的123轉換成了字符串“123”呢?

規則是:

  • 如果一個值是null,另一個是undefined,那么它們相等
  • 如果一個值是數字,另一個是字符串,先將字符串轉為數字再比較
  • 如果其中一個值是true,將true轉為1再比較,同理false轉換成0再比較
  • 如果一個值是對象,另一個是數字或字符串,則將對象轉換成原始值再進行比較(日期對象轉換成字符串,其它對象先嘗試調用valueOf()方法再嘗試使用toString())
  • 其它不同類型的比較都不相等

顯然上面的例子屬于第二種情況,“123”被隱式轉換為123了。

除了==運算符,諸如+、-、*、/、!、<、<=、>、>=等運算符兩邊的操作數類型不同時,都會發生隱式類型轉換,還包括while()語句和if()語句內的條件語句,alert()語句會將()內的值隱式轉換成字符串后再彈出。

“+”運算符

二元加法運算符“+”可以對兩個數字做加法,也可以做字符串連接操作:

1 + 1 // 2 "hello" + "world" // "hello world"

當二元加法運算符“+”遇到下面的運算時操作數會如何轉換呢?試著想想答案再往下看

1 + true "1" + true 1 + "1" {} + 1 {} + {}

隱式轉換規則:

  • 如果其中一個操作數是對象,對象會轉換成原始值:日期對象通過toString()方法轉換,其他對象通過valueOf()方法轉換,如果valueOf()返回值不是原始值再使用toString()方法轉換。
  • 在進行了對象到原始值的轉換后,如果其中一個操作數是字符串的話,另一個操作數也會轉換為字符串,然后進行字符串拼接。
  • 否則,兩個操作數都將轉換為數字(轉換不了的將轉換為NaN),然后進行加法操作。

根據規則,以上的例子結果是:

1 + true       // true轉換為1,然后加法得出結果2
"1" + true     // true轉換為"true",然后字符串拼接得出結果"1true"
1 + "1"        // 數字1轉換為"1",然后字符串拼接得出結果"11"
{} + 1         // {}對象調用toString()方法轉換為字符串"[object Object]",變成了"[object Object]" + 1,匹配第二條規則,1將轉換為字符串"1",然后字符串拼接得出結果"[object Object]1"
{} + {}        // 自己想想過程吧

當“+”做為一元運算符時,會把操作數轉換為數字(轉不了的轉成NaN)

“-”運算符

當“-”做為二元運算符時,會把操作數轉換為數字(轉不了的轉成NaN)

當“-”做為一元運算符時,會把操作數轉換為數字(轉不了的轉成NaN),同時改變運算結果的符合

比較運算符(">"、">="、"<"、"<=")

比較操作符的操作數可能是任意類型,然而只有數字和字符串才能真正執行比較操作,因此其它類型的操作數都將進行類型轉換,具體規則如下:

  • 如果操作數為對象,那么這個對象將轉換為原始值:同上,日期對象通過toString()方法轉換,其他對象通過valueOf()方法轉換,如果valueOf()返回值不是原始值再使用toString()方法轉換。
  • 在對象轉換為原始值后,如果兩個操作數都是字符串,將依次比較每個字符串的Unicode大小。
  • 在對象轉換為原始值后,如果至少有一個操作數不是字符串,那么兩個操作數都將轉換為數字進行比較,如果其中某個操作數無法轉換為數字,這個操作數將轉換為NaN,比較結果為false。

"*"、"/"、"%"、"!"

"*"、"/"、"%"會把操作數轉換為數字(轉不了的轉成NaN)

"!"會把操作數轉換為布爾值

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!