數據類型,就是將數據按照某一規則進行區別時所定義的分類標籤。好比說,一樣都是漢字組成的詞語,要分動詞、名詞、介詞等。es6
對數據分類,主要有兩個緣由:編程
第一,是爲了限制不一樣種類數據的操做。好比說當你聲明一個變量是一個數字,那麼,就只能對這個變量進行數字能進行的操做,這在編譯代碼及排查錯誤時尤其重要。數組
第二,因爲全部的數據都要存儲在計算機中,不一樣數據的存儲位置及所須要的內存大小也不同,而有了數據類型,編程的時候須要用大數據的時候才須要申請大內存,就能夠充分利用內存。 函數
例如大胖子必須睡雙人牀,就給他雙人牀,瘦的人單人牀就夠了。大數據
JavaScript 中變量是沒有類型的,只有值纔有。變量能夠隨時持有任何類型的值。優化
舉個例子:spa
// js let a = 4; a = '4'; a = false;
在上面的例子中能夠看到:咱們聲明 a 是一個數字,可是咱們在以後將 a 的值又改爲了字符串和布爾值(後面會講這些類型)也並無什麼異常。咱們能夠看到,變量 a 的類型是隨意轉變的,這在強類型語言裏是不容許的。prototype
所以,判斷一門語言是強類型仍是弱類型,就看這門語言中一個變量是否能夠賦不一樣數據類型的值。設計
在 JavaScript 中,共有七種數據類型,其中,六種是基本/原始類型,一種是對象/複合/引用類型。code
基本類型:
- 字符串(String):表示一個字符串,如「find」。
- 數字(Number):表示一個數字,如 45 。
- 布爾(Boolean):布爾值,包括 false 和 true 。
- 未定義(undefined):只有一個值,undefined , 表示未給變量賦值。
- 空值(null):只有一個值, null , 表示空值得關鍵字。
- Symbol(es6新增):表示一個惟一且不可改變的值。
引用類型:
- 對象(object): 各類值組成的集合。
其中,對象類型還有一些子類型,如數組,函數,JavaScript 的內建函數等。
主要有兩點:
對於 js 來說,是沒有棧內存的概念的,可是 js 在編譯執行代碼時,會首先進入一個執行上下文,在執行上下文的建立階段,會開闢一片區域,用來存儲變量和它們的值,這個區域就叫作變量對象。
大概長這個樣子:
如上圖所示,對於基本類型的變量,他們的變量名和值都會存儲在這個變量對象中,而對於 d , 這個引用類型的值,則只是將這個變量的名字和地址存在變量對象中,變量的值是存儲在堆內存空間的,這個區別將會在使用時產生很大的差別,咱們後面再講。
typeof
方法聲明一個變量,使用 使用 typeof
方法會返回一個惟一的數據類型字符串。但這個方法並不怎麼靠譜。
值 | 類型 | typeof 值 |
---|---|---|
23 | number | "number" |
"abc" | string | "string" |
false | boolean | "boolean" |
undefined | undefined | "undefined" |
Symbol() | symbol | "symbol" |
{} | object | "object" |
null | null | "object" |
function(){} | object | "funciton" |
從上表中咱們看到,有兩處地方和咱們預期不一致。
typeof null
返回的是 "object"
而不是 "null"
。這是 js 語言設計時的一個 bug, 而且在將來也不會更改。
想要爭取判斷 null 能夠加一個條件:
function typeOf(a) { if(!a && typeof a === "object") return "null"; return typeof a; } typeOf({}); // "object" typeOf(null); // "null"
typeof function(){} === "function"
, 這是由於function
做爲 js 的一等公民,是能夠調用的對象,設計者認爲有必要將它和普通對象區別開來。Object.prototype.toString.call()
方法除了 typeof
方法外,調用 Object.prototype.toString.call()
方法 也能夠返回一個包含數據類型的字符串,而且更爲準確。
值 | 類型 | Object.prototype.toString.call(值) |
---|---|---|
23 | number | '[object Number]' |
"abc" | string | '[object String]' |
false | boolean | '[object Boolean]' |
undefined | undefined | '[object Undefined]' |
Symbol() | symbol | '[object Symbol]' |
{} | object | '[object Object]' |
null | null | '[object Null]' |
function(){} | object | '[object Function]' |
[] | object | '[object Array]' |
從上面們能夠看出,這方法對於類型的檢測更加精確。
所以,咱們能夠寫一個函數,用來精確檢測類型。
function getClass (a) { const str = Object.prototype.toString.call(a) return /^\[object (.*)\]$/.exec(str)[1] } getClass(null) // "Null"; ...
關於數據類型,就先說到這裏,並無深刻到每一種類型中去講,感受沒有必要,關於細節有不少教程。我要作的,是讓你們從總體上來看數據類型在 JavaScript 中的表現,這將有助於你們理解後面更加複雜的知識。