Una variable puede almacenar dos tipos de valores: valores de tipo primitivo (primitive values) y valores de tipo de referencia (reference values).
ES6 introdujo un nuevo tipo de datos primitivo, Symbol, que representa un valor único. Es el séptimo tipo de datos del lenguaje JavaScript; los seis anteriores son: Undefined, Null, booleano (Boolean), cadena (String), número (Number) y objeto (Object).
Tipos primitivos
En JavaScript hay 6 tipos de datos básicos: Undefined, Null, Boolean, Number, String, Symbol (nuevo en ES6)!
Convención:Los tipos de datos básicos son equivalentes a los tipos de datos primitivos.
El acceso a los valores de los tipos de datos básicos es por valor.
-
Los valores de los tipos primitivos son inmutables.
var str = "123hello321"; str.toUpperCase(); // 123HELLO321 console.log(str); // 123hello321
-
La comparación de los tipos primitivos es una comparación de sus valores.
var a = 1; var b = true; console.log(a == b); // true console.log(a === b); // false
Arriba, los tipos de datos de a y b son diferentes, pero también se puede realizar la comparación de valores, porque antes de la comparación se realizó automáticamente una conversión implícita de tipos de datos.
== : solo realiza la comparación de valores
=== : no solo compara los valores, sino también los tipos de datos
-
Las variables de tipos primitivos se almacenan en la memoria de pila (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
El diagrama es el siguiente: la memoria de pila incluye el identificador de la variable y el valor de la variable.
Tipos de referencia
Aparte de los 6 tipos de datos básicos anteriores, el resto son tipos de referencia, denominados colectivamente tipo Object. Si se subdividen, hay: tipo Object, tipo Array, tipo Date, tipo RegExp, tipo Function, etc.
El acceso a los valores de los tipos de referencia es por referencia.
-
Los valores de los tipos de referencia son mutables.
var obj = {name:"zyj"}; // 创建一个对象 obj.name = "percy"; // 改变 name 属性的值 obj.age = 21; // 添加 age 属性 obj.giveMeAll = function(){ return this.name + " : " + this.age; }; // 添加 giveMeAll 方法 obj.giveMeAll(); -
La comparación de los tipos de referencia es una comparación de referencias.
var obj1 = {}; // 新建一个空对象 obj1 var obj2 = {}; // 新建一个空对象 obj2 console.log(obj1 == obj2); // false console.log(obj1 === obj2); // falseDebido a que obj1 y obj2 hacen referencia respectivamente a dos objetos diferentes almacenados en la memoria de montón (Heap), ¡los valores (direcciones de referencia) de las variables obj1 y obj2 también son diferentes!
-
Los valores de los tipos de referencia son objetos (Object) guardados en la memoria de montón (Heap).
A diferencia de otros lenguajes de programación, JavaScript no puede manipular directamente el espacio de memoria (montón) de los objetos.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 };
El diagrama es el siguiente:
La memoria de pila (Stack) guarda el identificador de la variable y el puntero que apunta al objeto en la memoria de montón (Heap).
La memoria de montón (Heap) guarda el contenido del objeto.
Detección de tipos
-
typeof: se utiliza a menudo para detectar si una variable es un tipo de datos primitivo.
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: se utiliza para determinar si el objeto al que apunta la propiedad prototype de un constructor existe en la cadena de prototipos de otro objeto a detectar.
En pocas palabras, consiste en determinar si una variable de tipo de referencia es específicamente un objeto de un cierto tipo.
({}) instanceof Object // true ([]) instanceof Array // true (/aa/g) instanceof RegExp // true (function(){}) instanceof Function // true
Dirección del artículo original: https://segmentfault.com/a/1190000006752076