說好聽是說JS靈活, 說很差聽就是JS的坑太多, JS類型轉換就是一個大坑, JS的類型包括了原始類型的[null, undefined, String ,Number, Boolean],以及對象類型的[function, object];數組
null, undefined, "", 0, -0, NaN 轉換成布爾值是false, 剩下的全轉化爲 ==>> true;
null, "", false, , [] 轉換成數字是 ==>> 0;
undefind, "One", 一個非數字值的數組:["a"], function(){} 轉化成數字是 ==>> NaN;
true, 一個值爲數字的數組:[1] , 是數字的字符串:"1",轉換爲數字是 ==>> 1;
其中null和undefined沒有構造函數, 他們兩個轉化爲對象的時候會報類型錯誤;函數
JS若是把對象轉化成只付出 會調用對象的toString()方法,若是toString()方法返回的值是一個對象,那麼會調用對象的valueOf()方法,把valueOf()的返回值轉化成字符串, 若是該值還不是原始值就會報錯;spa
對象轉化成數字的時候會調用valueOf()方法, 若是該方法返回值非原始值, 那麼回調用該對象的toString(), 把toString的返回值轉化成數字, 若是toString()返回值仍是非原始值,那麼就會報錯;3d
那麼爲何第一個是NaN呢? 由於obj是一個空對象, (除了Date類型的對象的valueOf()返回的是數字之外, 全部的對象的valueOf()返回本身 , 神設定~。~),obj的valueOf()返回的是對象,因此他又調用toString()方法, toString()返回了字符串[object Object], [object Object]轉化成數字就變成了NaN;code
若是是對象類型轉換成原始類型,只要把須要轉化的對象放到原始類型的構造函數中進行解包,好比:對象
Number( {valueOf:function(){return 1111}} ) // ==>> 1111 String( {toString:function(){return 1111}} ) //==>> "1111" Boolean( {} ) // ==>> true
若是你以爲麻煩的話能夠經過算術運算符進行快速轉換:blog
var obj = { toString : function() {return 1111}}; obj+"" ==>> "1111"; var obj = { valueOf : function() {return 1111}}; +obj ==>> 1111;
要讓原始類型轉化成對象類型要將元素類型放到對象類型的構造函數中, 須要讓構造函數包裝;字符串
console.log( typeof true ); //==>> boolean console.log( typeof new Boolean( true ) ) //==>> object
表做爲參考, 來自js權威指南, 看過書的應該都記得這表:string
原始類型和對象類型 | 轉換成String: | 轉換成Number | 轉換成Boolean | 轉換成Object |
---|---|---|---|---|
undefined | "undefined" | NaN | false | throws TypeError |
null | "null" | 0 | false | throws TypeError |
true | "true" | 1 | new Boolean(true) | |
false | "false" | 0 | new Boolean(false) | |
"" (empty string) | 0 | false | new String("");Object("") | |
"1.2" (nonempty, numeric) | 1.2 | true | new String("1.2");Object("1.2") | |
"one" (nonempty, non-numeric) | NaN | true | new String("one");Object("one") | |
0 | "0" | false | new Number(0);Object(0) | |
-0 | "0" | false | new Number(-0);Object(-0) | |
NaN | "undefined" | false | new Number(NaN);Object(NaN) | |
Infinity | "Infinity" | true | new Number(Infinity);Object(Infinity) | |
-Infinity | "-Infinity" | true | new Number(-Infinity);Object(-Infinity) | |
1 (finite, non-zero) | "1" | true | new Number(1);Object(1) | |
{} (any object) | NaN | true | ||
[] (empty array) | "" | 0 | true | |
[9] (1 numeric elt) | "9" | 9 | true | |
['a'] (any other array) | use join() method | NaN | true | |
function(){} (any function | "undefined" | NaN | true |