Переменная может хранить два типа значений: примитивные значения и ссылочные значения.

В ES6 был введён новый примитивный тип данных — Symbol, который представляет уникальное значение. Это седьмой тип данных в языке JavaScript; первые шесть — Undefined, Null, Boolean, String, Number, Object.


Примитивные типы

В JavaScript существует 6 примитивных типов данных: Undefined, Null, Boolean, Number, String, Symbol (новый в ES6)!

Соглашение:Примитивные типы данных эквивалентны примитивным типам.

Доступ к значениям примитивных типов данных осуществляется по значению.

  • Значения примитивных типов неизменяемы.

    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 ссылаются на два разных объекта, хранящихся в куче, значения (адреса ссылок) переменных obj1 и obj2 также различаются!

  • Значения ссылочных типов — это объекты (Object), хранящиеся в куче (Heap).
    В отличие от других языков программирования, 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