javascript是一門弱類型語言 它的函數形參不指定類型 它的變數在賦值時連同類型一起覆蓋 所以不存在類型轉換問題,等等,不存在類型轉換問題?哦 只是賦值時不存在類型轉換問題。 javascript的類型轉換主要存在於運算式運算過程中,更直接的說,js的類型預設轉換幾乎全是由運算子引起的,這篇文章裡還會討論顯式轉換。
在js的運算子中 有以下幾類
- +運算子 只作用於字串和數字
- - * / %只作用於數字
- ! 只作用於布爾型
如果我們對2個變數a 和b使用+運算子 a+b
那麼 js解譯器也許會面對這樣一個問題: a和b也許不都是數字並且不都是字串
此時 他將如何做呢?
最基本的答案是 調用a 和b的 valueOf函數 把原來的運算式變成
a.valueOf()+b.valueOf()
但是 這並不完全 因為實際情況要複雜的多:
1.如果a.valueOf()和b.valueOf()仍然不適合+運算子呢?繼續調用它們的valueOf 直到傳回型別出現迴圈為止。在valueOf無法達到要求的時候 它會調用toString
2.如果a或b沒有valueOf這個方法呢?一般情況下不會,因為Object.prototype提供了這個方法 它是原型鏈的頂級,所有對象都會共用它的方法。不過 如果你很bt地delete Object.prototype.valueOf 那麼很可能導致你的對象整條原型鏈上都沒有valueOf 這個時候 它會調用toString
3.如果a和b一個是字串 另一個是數字 應該優先轉換哪個呢? 當然是字串啦:P
4.如果a和b的toString也被刪掉了呢? delete Object.prototype.toString; 暈 太bt了吧 這樣就只能當運算子和b不存在了
+運算子在所有運算子中的行為算是比較複雜的 其他運算子因為幾乎只對一種類型起作用 所以並不像+這麼複雜:
只對數字運算子起作用的運算子 在valueOf失敗時 會把對象轉換成NaN
只對布爾型起作的運算子 不會調用valueOf 會把對象按以下規則轉換:
Null 字元串""
數字0
Null 物件null
非法數無窮大NaN
未定義類型undefined
轉換成false 其他轉換成true
BTW ,|| &&不是只對布爾值起作用