Переменная может хранить два типа значений: примитивные значения и ссылочные значения.
В 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