33 個 JavaScript 核心概念系列(一): 數據類型

1、定義

1. 什麼是數據類型?

數據類型,就是將數據按照某一規則進行區別時所定義的分類標籤。好比說,一樣都是漢字組成的詞語,要分動詞、名詞、介詞等。git

2. 爲何會有數據類型?它出現的意義是什麼?

對數據分類,主要有兩個緣由:es6

第一,爲了限制不一樣種類數據的操做。好比說當你聲明一個變量是一個數字,那麼,就只能對這個變量進行數字能進行的操做,這在編譯代碼及排查錯誤時尤其重要。github

第二,因爲全部的數據都要存儲在計算機中,不一樣類型數據的存儲位置及所須要的內存大小也不同,而對數據分類後,編程時須要用大數據的時候才須要申請大內存,這樣能夠充分利用內存。編程

例如大胖子必須睡雙人牀,就給他雙人牀,瘦的人單人牀就夠了。數組

2、JavaScript 中的數據類型

1. 爲何稱 JavaScript 爲弱類型語言?

JavaScript 中變量是沒有類型的,只有值纔有。變量能夠隨時持有任何類型的值。bash

舉個例子:函數

// js
let a = 4;
a = '4';
a = false;
複製代碼

從上面的例子中能夠看到,咱們聲明 a 是一個數字,可是咱們在以後將 a 的值又改爲了字符串和布爾值(後面會講這些類型)。能夠看到,變量 a 的類型是能夠隨意轉變的,這在強類型語言裏是不容許的。大數據

所以,判斷一門語言是強類型仍是弱類型,就看這門語言中一個變量是否能夠賦不一樣數據類型的值。優化

2. JavaScript 有哪些數據類型?

在 JavaScript 中,共有七種數據類型,其中,六種是基本/原始類型,一種是對象/複合/引用類型。ui

基本類型:

  • 字符串(String):表示一個字符串,如「find」。
  • 數字(Number):表示一個數字,如 45 。
  • 布爾(Boolean):布爾值,包括 false 和 true 。
  • 未定義(undefined):只有一個值,undefined , 表示未給變量賦值。
  • 空值(null):只有一個值, null , 表示空值得關鍵字。
  • Symbol(es6新增):表示一個惟一且不可改變的值。

引用類型:

  • 對象(object): 各類值組成的集合。

其中,對象類型還有一些子類型,如數組,函數,JavaScript 的內建函數等。

3. 基本數據類型和複合數據類型有什麼區別?

主要有兩點:

  1. 基本類型的數據是不可再拆分的。 這也就是爲何稱他爲基本類型,就像組成單詞的 26 個英文字母、組成數字的 0 -9;而複合類型的數據,是由基本類型組成。好比一個單詞,能夠由數個字母組成,一個句子,能夠由數字、字母及標點複合組成。

  2. 它們在計算機中的存儲方式不一樣。計算機存儲數據時爲了內存及運行速度考慮,每每會對存儲作優化,有的會將值自己存儲在棧內存中,也有可能會在棧內存中存儲一個值的引用,而把值自己存在堆內存中。對於不一樣的語言,實現起來或許會有不一致,但思想都是如此。

4. js 中值類型和引用類型的存儲方式是怎樣的?

對於 js 來說,是沒有棧內存的概念的,可是 js 在編譯執行代碼時,會首先進入一個執行上下文,在執行上下文的建立階段,會開闢一片區域,用來存儲變量和它們的值,這個區域就叫作變量對象。

大概長這個樣子:

如上圖所示,對於基本類型的變量,他們的變量名和值都會存儲在這個變量對象中,而對於 d ,這個引用類型的值,則只是將這個變量的名字和地址存在變量對象中,變量的值是存儲在堆內存空間的。

關於執行上下文,後面會有文章專門講,暫時先不作深刻講解。

5. 如何判斷一個數據的數據類型?

- 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"

從上表中咱們看到,有兩處地方和咱們預期不一致。

  1. 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"
    複製代碼
  2. 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";
...
複製代碼

原文地址: 落明的 blog

相關文章
相關標籤/搜索