変数には2種類の値、基本型の値(primitive values)と参照型の値(reference values)を格納できます。

ES6 は新しいプリミティブデータ型 Symbol を導入しました。これは唯一無二の値を表します。これは JavaScript 言語の7番目のデータ型で、最初の6つは Undefined、Null、ブール値(Boolean)、文字列(String)、数値(Number)、オブジェクト(Object)です。


基本型

JavaScript には6つの基本データ型があります:Undefined、Null、Boolean、Number、String、Symbol (new in ES 6) !

取り決め:基本データ型はプリミティブデータ型と同じ意味です。

基本データ型の値は値によってアクセスされます。

  • 基本型の値は不変です

    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 のデータ型は異なりますが、それでも値の比較ができます。これは比較の前に、データ型の暗黙的な変換が自動的に行われるためです。

    • == : 値の比較のみを行います

    • === : 値の比較だけでなく、データ型の比較も行います

  • 基本型の変数はスタックメモリ(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

原文アドレス:https://segmentfault.com/a/1190000006752076