強制類型轉換(顯示類型轉換)
- Number()
- Boolean()
- String()
調用數組、函數、對象和正則表達式的valueOf() 會返回對象本身。日期類定義的valueOf()方法會返回它的一個內部表示:1970年1月1日以來的毫秒數。
自動類型轉換
加號(+) 運算符
- 作爲一元運算符: 常用於將操作數轉換爲數值
* 作爲二元運算符
* 如果其中一個爲對象,則會將對象轉換爲原始類型。日期對象通過調用toString()執行轉換,其他的通過valueOf()(**如果valueOf()返回一個原始類型的值得話**)。由於多數對象不具備可用的valueOf()方法,因此他們會通過toString()來進行轉換。
* 對象轉換成原始類型的值後,如果其中一個爲字符串的話,另一個操作數也要轉換成字符串,然後進行字符串的拼接。
* 否則,兩個數都轉換爲數字(或者NaN),然後進行加法操作。
兩個例題
有一個很有意思的一個,不能以上面的規則理解:
{} + {} : NaN (其實在Chrome控制檯,輸出的爲:"[object Object][object Object]")
{} + [] : 0
這是因爲,瀏覽器會把第一個{} 作爲一個空的代碼塊解析,因此上面的兩個分別就等價於: + {} , + [] 因此,得到上面相應的結果。
這裏添加一個這兩個的轉換過程: 上面說了,分別等價於 + {} 和 + [] 。因此,+作爲一元運算符,要把其後面的{} 和 []轉換爲整數。這個轉換相當於Number({}) 和Number([])。在最開始我們就介紹了通過Number()進行轉換的原則:
- 先調用valueOf()方法。
對於對象來說,valueOf()方法返回的是其本身。
- 既然上面的返回的不是基本類型,再調用toString()方法。分別返回 ”[object Object]“ 和 ”“。這是屬於基本類型的(String)。因此對他們分別調用Number(),轉換後的值分別爲: NaN 和 0
== 運算符
- 如果一個是null,一個是undefined,則返回true
- 如果一個是數字,一個是字符串,則將字符串轉換爲數字,然後再進行比較。
- 如果一個值爲布爾值,將其轉換爲數字
- 如果一個數值爲對象,另一個爲數值或者是字符串,則先將對象通過valueOf()或toString()轉換爲原始類型,然後再比較。(JS核心的內置類會首先嚐試valueOf(),再嘗試使用toString().除了日期類,日期類只使用toString()轉換。)
- 不滿足上面的,均爲false