你不知道的javascript -- 數據類型
1. 數據類型
在js中有7中數據類型
其中6種是基本類型 包括 null, undefined, boolean, number, string和symbol,還有一種是引用類型object
但是判斷數據類型的時候除了null以外都可以用typeof
1. null
null應該如何判斷呢,應該是這樣的
typeof a === ‘object‘ && !a
2) undefined
undefined判斷可以用typeof,
有一個有趣的現象,很少有人關註未聲明吧,事實上未聲明 (undeclared) 和聲明但未定義 (undefined) 是兩種不同的現象,
但是在js中比較坑的是undeclared和undefined的是一樣的,所以並不能知道變量的聲明與否
比較幸運的一點是如果一個變量未聲明就拿來用會導致嚴格模式下的報錯而判斷一個undeclared的變量卻可以防止報錯
比如要表示加入a未聲明就聲明一個a可以寫作
2. 數組和類數組
1. 類數組指的是一類對象,他們可叠代,擁有數值作為屬性,最重要的一點是他們擁有length屬性,所以字符串也是一個類數組。
2. js數組的判斷也不能用typeof但是對於對象有一個新的判別方法 instanceof
3. 數組是一種對象所以可以寫作 a[‘foo‘] = ‘bar‘也可以,但是卻不能增加他的length, 但是比較有趣的一點是 a["13"] = "for", 卻會導致length變成14,雖然傳入的13是一個數值
4. 類數組轉化數組可以用
Array.from( fakeArr )
也可以
Array.prototype.slice.call( fakeArr )
Array.from是一個相當強大的東西,而slice是一個比較有趣的實現。
5. 借用數組的方法是一件很好玩的事情,在js裏邊數組擁有超級有錢的主,有很多實用的工具,字符串就很窮了,所以字符串可以和數組借用噢,怎麽借用呢,就像上邊的call那個樣子咯。
3. 數值
數值的相關知識比較冷門,但也蠻有意思的
1. 一直被人詬病的一定是js中沒有真正的整數,很經典的一個是
0.2 + 0.1 = 0.30000000000000004
就是因為js內部存儲並不是整型,浮點數這樣區分的,
2. 用e來表示數值是一個很不常見的做法,估計也只是因為計算器顯示不夠才會那麽表示,js中也是可以的噢,比如3.04e3就等於3040
3. 數值比較有趣的一點是42.toFixed(3)是一種錯誤的語法,居然是因為42後邊的點被當成小數點解析了因為42.也是一個正確的表達方式,所以42..toFixed(3)是沒毛病的
4. 16進制的數值是在前邊加 0x 而8進制的數值是在前邊加上0
5. NaN並不是說數據不是一個數值,更貼切的說是一個壞死的數值,比如 2/ ‘a‘ 就是一個壞死的數值。但是
typeof 2/‘a‘ === ‘number‘ // true
同時js中有一個全局的函數 isNaN,
‘a‘ === NaN // false
isNaN(‘a‘) // true
6. +0 和 -0 在js中從數值上說一樣,但是從向量的角度是不一樣的。
7. ES6的新方法Object.is
Object.is(2/ ‘a‘, NaN) // true
4. 值和引用
在老生常談的引用類型和基本類型中也有一些很多人並不清晰的地方
1. 在js中是沒有指針這個概念的,而且js中並沒有變量之間互相引用,只有可能是一個值被10個變量引用,但是他們互相是沒有關系的
2. 基本類型的復制是通過所引用的值的賦值,而引用類型是通過復制引用本身,而不是相互引用。所以會又下邊這種現象。
var a = [1, 2, 3]; var b = a; b.push(4) // 1, 2, 3, 4 b // [1, 2, 3, 4]; a // [1, 2, 3, 4];
b = [1, 2, 3, 4]; b.push(5) b // [1, 2, 3, 4, 5]; a // [1, 2, 3, 4];
上邊的代碼表示當 b 換了一個引用的值之後和 a 就沒什麽關系了,所以在變動之後 a 並不會發生變化
你不知道的javascript -- 數據類型