全部的對象都繼承有toString() 和 valueOf() 方法,對象到字符串,對象到數字的轉換,會經過調用待轉換對象的這兩個方法中的一個來完成。javascript
返回一個反映這個對象的字符串,而不少類都定義了不一樣版本的toString( )。java
({}.toString()); //=> "[object Object]" [1,2].toString(); //=> "1,2" true.toString(); //=> "true" new Date(1970,0,1).toString(); //=> "Thu Jan 01 1970 00:00:00 GMT+0800 (CST)" Error("一個錯誤信息").toString(); //=> "Error: 一個錯誤信息" (function (x){return x}).toString(); //=> "function (x){return x}" /\d/.toString(); //=> "/\\d/" 或者 "/\d/" 瀏覽器不一樣返回也可能會不一樣
若是對象存在任意原始值,它就默認將對象轉換爲表示它的原始值,若是對象是複合值,並且大多數對象沒法真正表示爲一個原始值,所以默認的valueOf( )方法簡單地返回對象自己,而不是返回一個原始值。正則表達式
數組、函數、和正則表達式簡單的繼承了這個默認方法,調用這些類型的實例的valueOf( )方法只是簡答返回對象自己。數組
日期類定義的valueOf( )方法會返回它的一個內部表示:1970年1月1日以來的毫秒數。瀏覽器
[1,2].valueOf(); //=> [1,2] (function (){}).valueOf(); //=> function (){} /\d/.valueOf(); //=> /\d/ new Date().valueOf(); //=> 1502941383029
原始值:不可變動的值,包括undefined、null、布爾值、數字、和字符串。
看下面這張圖,列出了一些基本的類型轉換,這張圖來自 JavaScript權威指南。函數
好了,咱們如今已經瞭解toString( )方法 和 valueOf( )方法了,下來咱們來講說,對象到字符串和對象到數字的轉換。spa
一、若是對象具備toString( )方法,則調用這個方法。若是她返回一個原始值,JavaScript將這個值轉換爲字符串(若是自己不是字符串的話),並返回這個字符串結果。
二、若是對象沒有toString( )方法,或者這個方法並不返回一個原始值,那麼JavaScript會調用valueOf( )方法。若是存在這個方法,則JavaScript調用它。若是返回值是原始值,JavaScript將這個值轉換爲字符串(若是自己不是字符串的話),並返回這個字符串結果。
三、不然,JavaScript沒法從toString()或者valueOf( )得到一個原始值,所以這時它將拋出一個類型錯誤異常。.net
一、若是對象具備valueOf( )方法,後者返回一個原始值,則JavaScript將這個原始值轉換爲數字(若是須要的話)並返回這個數字。
二、不然,若是對象具備toString( )方法,後者返回一個原始值,則JavaScript將其轉化並返回。
三、不然,JavaScript拋出一個類型錯誤異常。3d
因此這就解釋了,爲何空數組會被轉換爲數字0,爲何具備單個元素的數組一樣會轉換成一個數字。
數組繼承了默認的valueOf( )方法,這個方法返回一個對象而不是一個原始值,所以,數組到數字的轉換則調用toString( )方法。空數組轉換爲空字符串,空字符串轉換爲數字0。
含有一個元素的數組轉換爲字符串的結果和這個元素轉換字符串的結果同樣。
若是數組只包含一個數字元素,這個數字轉換爲字符串,在轉換回數字。code
JavaScript中的"+"運算符能夠進行數學加法和字符串鏈接操做。若是它的其中一個操做數是對象,則JavaScript將使用特殊的方法將對象轉換爲原始值,而不是使用其餘算術運算符的方法執行對象到數字的轉換,"= ="相等運算符與此相似(運算隱式轉換規則)。若是將對象和一個原始值比較,則轉換將會遵守對象到原始值的轉換方式進行。
"+" 和 "= ="應用的對象到原始值的轉換包含日期對象的一種特殊情形。日期類是JavaScript語言核心中惟一的預先定義類型,它定義了有意義的向字符串和數字類型的轉換。
對於全部非日期的對象來講,對象到原始值的轉換基本上是對象到數字的轉換(首先調用valueOf( )),日期對象則使用對象到字符串的轉換模式,然而,這裏的轉換和上文講述的並不徹底一致:經過valueOf( )或者toString( )返回的原始值將被直接使用,而不會被強制轉換爲數字或字符串。
和"= ="同樣,"<"運算符以及其餘關係運算符也會作對象到原始值的轉換,但要除去日期對象的特殊情形:任何對象都會首先嚐試調用valueOf( ),而後調用toString( )。無論獲得的原始值是否直接使用,它都不會進一步被轉換爲數字或字符串。
本文說了說 toString( )方法 和 valueOf( )方法的基礎知識,文中的許多概念是出自JavaScript權威指南一書,你們能夠多看看書。
能夠試想下面這個運算結果,用到了上面說的相關規則進行隱式轉換
(![]+[])[+!![]- -+!![]- -+!![]]+({}+[])[+!![]]+(![]+[])[+!![]- -+!![]- -+!![]]