曾經看到過這樣一個代碼: (!(~+[])+{})[--[~+""][+[]]*[~+[]]+~~!+[]]+({}+[])[[~!+[]*~+[]]] = sb , 你敢相信, 當時就嚇了 寶寶一跳。javascript
剛接觸到時候,Js很讓我困惑,正是因爲它‘善變’,下面我來總結一下:java
1. JS的數據類型: Number,Boolean,String,Undefined,Null,Symbol(es6新定義的)和 Object (注: Array是特殊的Object)es6
typeof 返回的7中類型: number boolean string object undefined object function面試
MDN 這樣介紹Javascript: JavaScript 是一種弱類型或者說動態語言。這意味着你不用提早聲明變量的類型,在程序運行過程當中,類型會被自動肯定。這也意味着你可使用同一個變量保存不一樣類型的數據函數
2. 下面來看下常見的隱式轉換:spa
基本類型:對象
運算符(+,-,*,/,%)操做時 轉換類型blog
」+「 號運算符 : ip
總結: 當加號運算符時,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, 同理。
總結: 剛開始接觸的時候,確實很迷惑,記得有次面試,就出的有隱式轉換的題,當時那個心情,內心一萬個草泥馬在那飛。總之,多敲一瞧代碼就知道了它的變化了。