js弱類型轉換的知識點

來源:互聯網
上載者:User

標籤:異常   轉換   美的   console   fine   type   為什麼   執行   nbsp   

本文屬於轉載知識點,以下是原博文不死鳥哇的文章,文章連結:原文JavaScript裡什麼情況下a==!a為true呢?

今天群裡有位同學問了這樣一個問題,JavaScript在什麼情況下會出現變數a == !a為true呢?據說是在司徒正美的書裡看到的。我覺得這個問題有點意思,涉及到了隱式類型轉換的問題,與大家分享一下吧!

    答案是當a = []的時候,這個答案我一開始也沒想出來。而是在調試器試了幾次之後知道的。但是其中的原因我是明白的。這是因為JavaScript的類型轉換。

    我們先來考慮這個問題,console.log([] == false)會列印什麼呢?

    答案是true。為什麼呢?

    首先,因為當"=="號兩邊其中一個是布爾值的話,先把它轉換為數字(ECMAScript的規範)。於是就變成了求[] == 0。

    然後問題是為什麼[]==0會是true呢?這是因為當"=="的一邊是字串或數字,另一邊是對象的時候(數組也是對象),先把對象值轉換為原始值再判斷相等。對象值到原始值是怎麼轉換的呢?.對於所有非日期雷對象來說,對象到原始值的轉換基本上就是對象到數位轉換。有3個步驟:

    1.所有對象先調用valueOf()方法,如果此方法返回的是原始值,則對象轉為這個原始值。

    2.如果valueOf方法返回的不是原始值,則調用toString方法,如果toString方法返回的是原始值嗎,則對象轉換為這個原始值。

    3.如果valueOf和toString方法均沒有返回原始值,則拋出TypeError異常.

好,讓我們看看[]到原始值的轉換是怎麼樣的?首先調用[].valueOf()方法,傳回值是對象自身,即[],這不是一個原始值。所以繼續調用[].toString()方法,返回的是Null 字元串"",這是一個原始值,所以此值就作為對象轉換為原始值的輸出。於是問題就變成了求"" == 0.

    最後,為什麼"" == 0會是true呢?相信很多同學都知道了,當"=="兩邊一個是字串一個是數位時候,先把字串轉為數字,再進行比較。“”轉成數字為0,所以最後得出[] == false為true。

    讓我們回到標題 [] == ![]為什麼是true。!的優先順序比==要高,所以會先執行![]。也就是先把[]轉為布爾類型再取反。[]轉布爾值是true,為什麼呢?因為在JavaScript裡除了false自身以外只有5個假值,分別是“”,undefined, null, 0, NaN。除了這5個假值以外,其他所有值轉布爾類型都是true。一切對象都是真值,包括new Boolean(false)。於是問題就成了剛才我們討論的 [] == false了。故得到 [] == ![]為true。

js弱類型轉換的知識點

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.