平常開發中,咱們使用到的Js定義的每個值都屬於某一種數據類型,常見的js數據類型有String(字符串)、Number(數字)、Boolean(布爾)、Object、Undefined、Null、Symbol等等,其中Symbol是ES6引入的新的數據類型,表示獨一無二的數值。由於 JS 自己是一門弱類型語言,以致於類型轉換髮生的頻繁很高,本文旨在幫助你們梳理各類類型之間的相互轉換,在每一小節講解轉換前,還會跟你們介紹這些「老朋友」前端
數據轉換分爲顯示轉換和隱式轉換git
String是存儲字符的變量,String使用長度屬性length來計算字符串的長度github
parseInt() 函數可解析一個字符串,從位置 0 開始查看每一個字符,直到找到第一個非有效的字符爲止,最後並返回一個整數。前端工程化
parseInt() 方法還有基模式,能夠把二進制、八進制、十六進制或其餘任何進制的字符串轉換成整數。基是由 parseInt() 方法的第二個參數指定的數組
相比上一節parseInt函數是將值轉換成整數,parseFloat函數則是將值轉換成浮點數且該方法方法也沒有基模式(轉換不了),只有對 String 類型調用這些方法,它們才能正確運行bash
Number() 函數的強制類型轉換與 parseInt() 和 parseFloat() 方法的處理方式類似,只是它轉換的是整個值,而不是部分值數據結構
上兩節提到的parseInt() 和 parseFloat() 方法只轉換第一個無效字符以前的字符串,所以 "1.2.3" 將分別被轉換爲 "1" 和 "1.2"。 而用Number() 進行強制類型轉換,"1.2.3" 將返回 NaN,由於整個字符串值不能轉換成數字。若是字符串值能被完整地轉換運維
+ string
經過在字符串前面加了個加號,這個數值就變成了number類型frontend
經過JSON.parse來完成,該注意的是JSON.parse遇到不可解析的字符串時,會拋出SyntaxError異常。函數
Number類型是以IEEE-754標準格式來表示的,包括整數和浮點數,若是是計算會轉化爲2進制再計算,這也是0.1 + 0.2不等於0.3的緣由
拓展:爲何在 JavaScript 中,0.1+0.2 不等於 0.3:
console.log( 0.1 + 0.2 == 0.3); //false
複製代碼
由於在JavaScript中的二進制的浮點數0.1和0.2並非十分精確,在他們相加的結果並不是正好等於0.3,而是一個比較接近的數字 0.3000000x ,因此條件判斷結果爲false。
問題:有沒有方法能夠解決上述問題呢❓ 可使用 JavaScript 提供的最小精度值Number.EPSILON,在這個偏差的範圍內就能夠斷定0.1+0.2===0.3爲true,以下👇所示
多數狀況下,Number 比 parseInt 和 parseFloat 等方法會更好
toString() 方法把數字轉換成指定進制形式的字符串。
經過在數字後面加了個空字符串,這個數值就變成了string類型
number類型轉Boolean,除了0數值和NaN對應的是false,其餘數值都對應true
Boolean 類型有且只有兩種值:true和false,主要用來表示邏輯意義上的真和假 boolean 這個類型比較簡單,這裏就不作複雜介紹
除了下面六個值被轉爲false,其餘都爲true
Object對象是js中比較複雜的數據類型,涉及的東西比其餘類型都多,簡單描述對象的話,能夠說是由key-value聚合的數據集合,即屬性的集合。JS對象主要能夠分爲兩大類,分別是內置對象和宿主對象
new Date();
數組(Array)、日期(Date)、null等的數據類型都是 object
這裏也介紹不一樣類型對象toString()方法的返回值
注意:好比 10 與 new Number(10) 是兩個不一樣的值,前者是 Number 類型, 後者是對象類型
再舉個列子好比 new Date 與 Date(),雖然得出結果同樣,但內置對象 Date 做爲構造器new 將產生新的對象,而做爲函數時,則產生字符串,以下所示👇
對象轉數組方式不少,其中包括如下幾種👇
若是類數組對象或者可遍歷的對象要轉換,還能夠用Array.from()方式,不過前提是object中必須有length屬性,返回的數組長度取決於這個object中length長度,同時object的key值必須是數值
類數組對象你能夠看作一種「僞數組」,雖然它沒法調用數組的方法,可是具有length屬性,能夠索引獲取內部項的數據結構
將日期對象轉換爲數字(時間戳的形式),能夠經過Number() 或者日期方法 getTime()
經過join或toString()的方法,join()能夠指定分隔符,若是不加參數,則默認使用逗號做爲分隔符,與 toString() 方法轉換操做效果相同
經過[1,2,3,4]初始化與new Array()做用同樣,也是建立了一個對象,新建的對象a.proto == Array.prototype
二者都是JavaScript語言用來表示"無"的值,且二者有共同點也有不一樣點,共同點在於都只有一個值,Null只有一個值 null,Undefined也只有一個值undefined。不一樣點在於Null 表示爲‘定義了可是值爲空’,而Undefind 表示爲'這裏應該有一個值,可是尚未定義'
要注意的是,若是咱們用typeof來判斷null的類型,會斷定爲 Object 類型,而不是Null類型只是爲何呢?
是由於JavaScript 數據類型在底層都是以二進制的形式表示的,二進制的前三位爲 0 會被 typeof 判斷爲對象類型,而 null 的二進制位剛好都是 0 ,所以,null 被誤判斷爲 Object 類型。此時咱們能夠用上一節談到的經過Object上的 原型上的toString()方法,以下👇
Object.prototype.toString.call(null) //[object Null]
來區分
undefined沒法轉爲數字、而Null被轉換爲0
再看一個例子👇
undefined沒法轉爲數字,第一個調用返回NaN.第二個是null轉爲隱式轉換爲0因此是2 ,第三個是若是傳入的參數是undefined會以默認值爲準,因此是3
==
雙等號中若是兩個值類型不一樣,也有可能相等,undefind == null
就是其中一個,包括 1 == '1'
,可是若是null與undefined與其餘數相等運算時就不行,由於它們不進行類型轉換(隱式轉換)Symbol是ES6新引入的數據類型,表示獨一無二的值,相似於一種標識惟一性的ID,Symbol 函數不一樣的是,直接用new 調用它會拋出錯誤,由於生成的是原始類型值,不是對象,是 Symbol 對象的構造器。下面簡單用一個例子就能告訴你如何獨一無二👇
symbol不能與其餘類型的值進行運算,會報錯(即不能隱式轉換),可是部分能夠顯示轉換爲字符串或者布爾值
由於類型識別中,若是使用 typeof 來判斷數據類型,只能區分基本類型,即 number、string、undefined、boolean、object、function、symbol這幾種,可是對於數組、null、對象這些來講,使用 typeof 都會統一返回 「object」 。這時候就須要用到其它方式👇
經過
Object.protptype.toString.call()
截取字符串[object...]中間字符串來區分類型,去掉先後符號,好比 "[object Array]"就提取了array來判斷,以前寫的工具庫有定義點我👉
那直接用 Object.prototype.toString(1)
能夠嗎?答案是不行的,由於考慮到爲了每一個對象都能經過,因此才須要以 Function.prototype.call()的形式來調用,傳遞要檢查的對象做爲第一個參數
在舉個例子,看以下👇
爲何Object.prototype和Array.protoType是兩個結果? 這裏涉及到一些原型鏈的問題,這裏也大概講一下
首先js中對象大多繼承自Object,當在某個對象上調用方法時,會先優先在該對象上進行查找,若是沒找到則會進入對象的原型(也就是.prototype)進行探索,若是仍是沒找到這個方法,一樣的也會進入對象原型的原型進行查找,直到找到或者進入原型鏈的頂端Object.prototype爲止。
因此,好比它調用的是Array.prototype.toString,雖然Array也繼承自Object,但js在Array.prototype上重寫了toString,因此致使結果不一樣,而第三個例子toString(),由於自己調用的是Array.prototype.toString,因此結果是跟第二種方式一致。
總結:只有Object.prototype上的toString才能用來進行復雜數據類型的判斷
樹醬但願將前端的樂趣帶給你們 本文已收錄 github.com/littleTreem… 喜歡就star✨
往期文章