被寫爛了的JS資料型別

劉一筆發表於2018-11-29

the part that is good is not original, and the part that is original is not good.--Samual johnson

JS之父曾引用英國詩人的這句話來評價其創造的JavaScript語言。資訊量挺大,詳見JS誕生時的歷史

眾所周知,JS有七種資料型別: number string null undefined object boolean symbol,其中symbol目前不很常用。“資料型別有什麼好講的,直接用不就是了?”,如果你對一個人足夠感興趣,我想你會去想了解他的前半生的。

被寫爛了的JS資料型別

由於Brendan創造JS的時候很大程度上借鑑了Java的資料型別,所以這裡我們來比較一下兩者的資料型別。可以明顯看出,關於數值的各個型別被brendan統一成number,只要是數值相關的,那在js中就是number型別,不管形式,不管大小(其實管,後文會提到)。char在js中對應了string。為紀念偉大的喬治·布林先生,brendan沒有對boolean進行任何改動(瞎猜的)。引用型別就有趣了,萬物歸於object。

為什麼JS可以一個number解決所有的數值型別,或者說一個變數就可以承載任意型別的資料。答案在你開始學習JavaScript的那幾段話中,“JavaScript是一種動態型別、弱型別...的語言”。動態型別意味著在宣告一個變數之後,可以儲存不同型別的變數。也就是說在JS中宣告一個變數a,他的初始值是13,var a= 13, 在這語句之後,你仍然可以再寫一個這樣的語句a = '13.333' 來改變a的值且不會報錯,甚至可以寫 a = 'name is sam'

不扒歷史鑽字眼了,探索和收斂的度需要控制好。下面逐一介紹每個資料型別。

number

  • JavaScript內部,所有數字都是以64位浮點數形式儲存,整數也是。

  • JavaScript能夠表示的數值範圍是2^-1023到2^1024,超出的範圍的數無法表示。

  • 溢位能夠表示的範圍會返回Infinity(正數)或者0(負數)

  • 數值可以有多種表示方法,字面形式和科學計數法。

  • 字面形式:35 0xFF(十六進位制) 123e。

  • 除以下情況外都採用字面形式表示,小數點前數字多於21位或後的零多於5個。

  • 有四種進位制來表示字面量:十進位制 十六進位制 八進位制 二進位制。

  • 屬於number型別的特殊數值:-0 +0 NaN 正負Infinity。

  • NaN參與的絕大部分運算都會得到諸如NaN false 這樣的答案。

  • 數值相關的全域性方法 parseInt() parseFloat() isNaN() isFinite()

string

  • 字串預設只能寫在一行內,分成多行將會報錯,如果必須,要在每一行的結尾使用反斜杆,但反斜杆後不能有諸如空格的其他字元。

  • 連線運算子 + 可以連線多個單行字串,將長字串拆成多行書寫。

  • length屬性返回字串長度。

  • 由於歷史原因,JavaScript使用Unicode字符集。

  • btoa()將任意值1轉為Base64,atob()將base64編碼轉為原來的值。

null & undefined

  • 都表示沒有,在真值判斷中都是false,null == undefined

  • 二者的來由很有歷史原因,最開始null用於標識物件為空,這也是現在tyepof null //object的原因,之後又新增了一個undefined型別。[2]

  • 二者的區別,null是一個表示‘空’的物件,轉為數值時為0,undefined 是一個表示此處無定義的原始值,轉為數值時為NaN。

Boolean

  • 除了以下值: undefined null false 0 NaN "" 或者' '其他值都視為true。

  • 空陣列和空物件都是true。

object

  • 注意,開頭是小寫的o。

  • 物件是一組鍵值對的集合(key-value),是一種無序的符合資料集合。

  • 物件裡的value可以是各種型別的資料,物件裡可以巢狀物件。

  • key都是字串,可加可不加引號。

  • 存放於物件中的函式稱為方法。

  • 物件屬性的讀取和賦值 objec.property || object['property']。

  • 可通過(Object.keys(obj)).length 獲得物件key的長度。

  • 使用delete命令刪除物件屬性值 delete obj.p

  • 使用in運算子檢查物件中是否有某個屬性 'p' in obj

  • 使用for in 迴圈遍歷物件屬性,會跳過不可遍歷屬性,且遍歷繼承的屬性。


學到的東西不夠多,就無法把這些點恰如其分的串聯起來。:(


[1] 該方法不能直接作用於Unicode字串,感謝評論區申君健同學提醒。

[2] MDN對於typeof null// object的解釋是:

在 JavaScript 最初的實現中,JavaScript 中的值是由一個表示型別的標籤和實際資料值表示的。物件的型別標籤是 0。由於 null 代表的是空指標(大多數平臺下值為 0x00),因此,null的型別標籤也成為了 0,typeof null就錯誤的返回了"object"  。

具體可參考文章

 


相關文章