js弱類型轉換的知識點

本文屬於轉載知識點,如下是原博文做者:不死鳥哇的文章,文章連接:原文JavaScript裏什麼狀況下a==!a爲true呢?數組

今天羣裏有位同窗問了這樣一個問題,JavaScript在什麼狀況下會出現變量a == !a爲true呢?聽說是在司徒正美的書裏看到的。我以爲這個問題有點意思,涉及到了隱式類型轉換的問題,與你們分享一下吧!.net

    答案是當a = []的時候,這個答案我一開始也沒想出來。而是在調試器試了幾回以後知道的。可是其中的緣由我是明白的。這是由於JavaScript的類型轉換。調試

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

    答案是true。爲何呢?blog

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

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

    1.全部對象先調用valueOf()方法,若是此方法返回的是原始值,則對象轉爲這個原始值。get

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

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

好,讓咱們看看[]到原始值的轉換是怎麼樣的?首先調用[].valueOf()方法,返回值是對象自身,即[],這不是一個原始值。因此繼續調用[].toString()方法,返回的是空字符串"",這是一個原始值,因此此值就做爲對象轉換爲原始值的輸出。因而問題就變成了求"" == 0.

    最後,爲何"" == 0會是true呢?相信不少同窗都知道了,當"=="兩邊一個是字符串一個是數字的時候,先把字符串轉爲數字,再進行比較。「」轉成數字爲0,因此最後得出[] == false爲true。

    讓咱們回到標題 [] == ![]爲何是true。!的優先級比==要高,因此會先執行![]。也就是先把[]轉爲布爾類型再取反。[]轉布爾值是true,爲何呢?由於在JavaScript裏除了false自身之外只有5個假值,分別是「」,undefined, null, 0, NaN。除了這5個假值之外,其餘全部值轉布爾類型都是true。一切對象都是真值,包括new Boolean(false)。因而問題就成了剛纔咱們討論的 [] == false了。故獲得 [] == ![]爲true。

相關文章
相關標籤/搜索