文章出處

  JS的靈活

  說好聽是說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把對象轉化成原始值

  JS如果把對象轉化成只付出 會調用對象的toString()方法,如果toString()方法返回的值是一個對象,那么會調用對象的valueOf()方法,把valueOf()的返回值轉化成字符串, 如果該值還不是原始值就會報錯;

 

  對象轉化成數字的時候會調用valueOf()方法, 如果該方法返回值非原始值, 那么回調用該對象的toString(),  把toString的返回值轉化成數字, 如果toString()返回值還是非原始值,那么就會報錯;

  那么為什么第一個是NaN呢? 因為obj是一個空對象, (除了Date類型的對象的valueOf()返回的是數字以外, 所有的對象的valueOf()返回自己 , 神設定~。~),obj的valueOf()返回的是對象,所以他又調用toString()方法, toString()返回了字符串[object Object], [object Object]轉化成數字就變成了NaN;

  如果是對象類型轉換成原始類型,只要把需要轉化的對象放到原始類型的構造函數中進行解包,比如:

Number( {valueOf:function(){return 1111}} ) // ==>>  1111
String( {toString:function(){return 1111}} ) //==>>  "1111"
Boolean( {} )  // ==>> true

  如果你覺得麻煩的話可以通過算術運算符進行快速轉換

    var obj = { toString : function() {return 1111}};
    obj+"" ==>> "1111";
    
    var obj = { valueOf : function() {return 1111}};
    +obj ==>> 1111;

 

  JS把原始值轉化成對象

  要讓原始類型轉化成對象類型要將元素類型放到對象類型的構造函數中, 需要讓構造函數包裝

console.log( typeof true ); //==>> boolean
console.log( typeof new Boolean( true ) ) //==>> object

 

  參考表

  表作為參考, 來自js權威指南, 看過書的應該都記得這表:

原始類型和對象類型轉換成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  

文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()