Js 中那些 隱式轉換


曾經看到過這樣一個代碼:  (!(~+[])+{})[--[~+""][+[]]*[~+[]]+~~!+[]]+({}+[])[[~!+[]*~+[]]] = sb , 你敢相信, 當時就嚇了 寶寶一跳。

剛接觸到時候,Js很讓我困惑,正是由於它‘善變’,下面我來總結一下:

1. JS的數據類型: Number,Boolean,String,Undefined,Null,Symbol(es6新定義的)和 Object (注: Array是特殊的Object)

    typeof 返回的7中類型: number boolean string object undefined object function

    

 

MDN 這樣介紹Javascript: JavaScript 是一種弱類型或者說動態語言。這意味着你不用提前聲明變量的類型,在程序運行過程中,類型會被自動確定。這也意味着你可以使用同一個變量保存不同類型的數據

2. 下面來看下常見的隱式轉換:

  基本類型

   運算符(+,-,*,/,%)操作時 轉換類型

    ”+“ 號運算符 : 

           

        

          

      總結: 當加號運算符時,String和其他類型時,其他類型都會轉為 String;其他情況,都轉化為Number類型 , 注: undefined 轉化為Number是 為’NaN‘, 任何Number與NaN相加都為NaN。

          其他運算符時, 基本類型都轉換為 Number,String類型的帶有字符的比如: '1a' ,'a1' 轉化為 NaN 與undefined 一樣。

        

      tip:(1)NaN 不與 任何值相等 包括自身,所以判斷一個值 是否為 NaN, 即用 "!==" 即可。  

         (2) 轉換為 Boolean類型為 false 的有:null,0,'',undefined,NaN,false  

          

        (3)number() 與 parseInt() 都可以將對象轉化為Number類型,Number函數要比parseInt函數嚴格很多。基本上,只要有一個字符無法轉成數值,整個字符串就會被轉為NaN。

           

  Object類型

    當object與基本類型運算時:

 

var obj = {
	toString: function(){
		return 6;
	},
	valueOf: function(){
		return 5;
	}
};

var obj1 = {
	valueOf: function(){
		return 'a';
	},
	toString: function(){
		return 'b';
	}
};

 

                      

 

                  

 

      

 

      當對 obj,obj1 用Number()和String()換轉時

              

      總結: Number類型會先調用valueOf(), String類型會先調用toString(),  如果結果是原始值,則返回原始值,否則繼續用toString 或 valueOf(),繼續計算,如果結果還不是原始值,則拋出一個類型錯誤; 

    看如下情況: 

            

        為什么 {} + [] = 0 ?  因為 javascript在運行時, 將 第一次{} 認為是空的代碼塊,所以就相當於 +[] = 0.  還有 {} +5 = 5, 同理。

 

  總結: 剛開始接觸的時候,確實很迷惑,記得有次面試,就出的有隱式轉換的題,當時那個心情,心里一萬個草泥馬在那飛。總之,多敲一瞧代碼就知道了它的變化了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM