JavaScript 深刻了解基本類型和引用類型的值

原文連接javascript

一個變量能夠存放兩種類型的值,基本類型的值(primitive values)和引用類型的值(reference values)。html

ES6 引入了一種新的原始數據類型 Symbol,表示獨一無二的值。它是 JavaScript 語言的第七種數據類型,前六種是:Undefined、Null、布爾值(Boolean)、字符串(String)、數值(Number)、對象(Object)。java

基本類型

JavaScript 中共有 6 種基本數據類型:UndefinedNullBooleanNumberStringSymbol (new in ES 6)git

約定:基本數據類型原始數據類型等意。github

基本數據類型的值是按值訪問的。編程

  • 基本類型的值是不可變的segmentfault

    var str = "123hello321";
    str.toUpperCase();     // 123HELLO321
    console.log(str);      // 123hello321
  • 基本類型的比較是它們的值的比較編程語言

    var a = 1;
    var b = true;
    console.log(a == b);    // true
    console.log(a === b);   // false

    上面 a 和 b 的數據類型不一樣,可是也能夠進行值的比較,這是由於在比較以前,自動進行了數據類型的 隱式轉換函數

    • == : 只進行值的比較this

    • === : 不只進行值得比較,還要進行數據類型的比較

  • 基本類型的變量是存放在棧內存(Stack)裏的

    var a,b;
    a = "zyj";
    b = a;
    console.log(a);   // zyj
    console.log(b);   // zyj
    a = "呵呵";       // 改變 a 的值,並不影響 b 的值
    console.log(a);   // 呵呵
    console.log(b);   // zyj

圖解以下:棧內存中包括了變量的標識符和變量的值

圖片描述

引用類型

除過上面的 6 種基本數據類型外,剩下的就是引用類型了,統稱爲 Object 類型。細分的話,有:Object 類型Array 類型Date 類型RegExp 類型Function 類型 等。

引用類型的值是按引用訪問的。

  • 引用類型的值是可變的

    var obj = {name:"zyj"};   // 建立一個對象
    obj.name = "percy";       // 改變 name 屬性的值
    obj.age = 21;             // 添加 age 屬性
    obj.giveMeAll = function(){
      return this.name + " : " + this.age;
    };                        // 添加 giveMeAll 方法
    obj.giveMeAll();
  • 引用類型的比較是引用的比較

    var obj1 = {};    // 新建一個空對象 obj1
    var obj2 = {};    // 新建一個空對象 obj2
    console.log(obj1 == obj2);    // false
    console.log(obj1 === obj2);   // false

    由於 obj1 和 obj2 分別引用的是存放在堆內存中的2個不一樣的對象,故變量 obj1 和 obj2 的值(引用地址)也是不同的!

  • 引用類型的值是保存在堆內存(Heap)中的對象(Object)
    與其餘編程語言不一樣,JavaScript 不能直接操做對象的內存空間(堆內存)。

    var a = {name:"percy"};
    var b;
    b = a;
    a.name = "zyj";
    console.log(b.name);    // zyj
    b.age = 22;
    console.log(a.age);     // 22
    var c = {
      name: "zyj",
      age: 22
    };

圖解以下:

  • 棧內存中保存了變量標識符和指向堆內存中該對象的指針

  • 堆內存中保存了對象的內容

圖片描述

檢測類型

  • typeof:常常用來檢測一個變量是否是最基本的數據類型

    var a;
    typeof a;    // undefined
    
    a = null;
    typeof a;    // object
    
    a = true;
    typeof a;    // boolean
    
    a = 666;
    typeof a;    // number 
    
    a = "hello";
    typeof a;    // string
    
    a = Symbol();
    typeof a;    // symbol
    
    a = function(){}
    typeof a;    // function
    
    a = [];
    typeof a;    // object
    a = {};
    typeof a;    // object
    a = /aaa/g;
    typeof a;    // object
  • instanceof:用來判斷某個構造函數的 prototype 屬性所指向的對象是否存在於另一個要檢測對象的原型鏈上

    • 簡單說就是判斷一個引用類型的變量具體是否是某種類型的對象

      ({}) instanceof Object              // true
      ([]) instanceof Array               // true
      (/aa/g) instanceof RegExp           // true
      (function(){}) instanceof Function  // true

更詳細的類型檢測請看參考資料!

有錯誤的地方,歡迎你們指出來!

參考資料

相關文章
相關標籤/搜索