重學Javascript之類型轉換

強制類型轉換(顯示類型轉換)

  • Number()
  • Boolean()
  • String()

調用數組、函數、對象和正則表達式的valueOf() 會返回對象本身。日期類定義的valueOf()方法會返回它的一個內部表示:1970年1月1日以來的毫秒數。

自動類型轉換

加號(+) 運算符

-  作爲一元運算符:  常用於將操作數轉換爲數值

*   作爲二元運算符

    *   如果其中一個爲對象,則會將對象轉換爲原始類型。日期對象通過調用toString()執行轉換,其他的通過valueOf()(**如果valueOf()返回一個原始類型的值得話**)。由於多數對象不具備可用的valueOf()方法,因此他們會通過toString()來進行轉換。

    *   對象轉換成原始類型的值後,如果其中一個爲字符串的話,另一個操作數也要轉換成字符串,然後進行字符串的拼接。

    *   否則,兩個數都轉換爲數字(或者NaN),然後進行加法操作。

兩個例題

有一個很有意思的一個,不能以上面的規則理解:

{} + {} : NaN (其實在Chrome控制檯,輸出的爲:"[object Object][object Object]")

{} + [] : 0

這是因爲,瀏覽器會把第一個{} 作爲一個空的代碼塊解析,因此上面的兩個分別就等價於: + {} , + [] 因此,得到上面相應的結果。

這裏添加一個這兩個的轉換過程: 上面說了,分別等價於 + {} 和 + [] 。因此,+作爲一元運算符,要把其後面的{} 和 []轉換爲整數。這個轉換相當於Number({}) 和Number([])。在最開始我們就介紹了通過Number()進行轉換的原則:

  1. 先調用valueOf()方法。

對於對象來說,valueOf()方法返回的是其本身。
  1. 既然上面的返回的不是基本類型,再調用toString()方法。分別返回 ”[object Object]“ 和 ”“。這是屬於基本類型的(String)。因此對他們分別調用Number(),轉換後的值分別爲: NaN 和 0

== 運算符

  • 如果一個是null,一個是undefined,則返回true
  • 如果一個是數字,一個是字符串,則將字符串轉換爲數字,然後再進行比較。
  • 如果一個值爲布爾值,將其轉換爲數字
  • 如果一個數值爲對象,另一個爲數值或者是字符串,則先將對象通過valueOf()或toString()轉換爲原始類型,然後再比較。(JS核心的內置類會首先嚐試valueOf(),再嘗試使用toString().除了日期類,日期類只使用toString()轉換。
  • 不滿足上面的,均爲false

這裏要注意: 在 + 或 ==進行的隱式轉換中,對象(除了日期類型)都是先嚐試使用valueOf()進行轉換,然後再嘗試使用toString()。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章