javascript的類型預設轉換機制.

來源:互聯網
上載者:User

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 ,|| &&不是只對布爾值起作用

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.