1、数据类型
1.1 基本数据类型:null、undefined、string、number、boolean、Symbol(ES6)。
1.2 引用数据类型:Object(JS中除了基本数据类型以外都是对象)。引用类型有以下几种:object、Array、Function、Date、RegExp、特殊的基本包装类型(String、Number、Boolean)以及单体内置对象(Global、Math)。
1.3 区别:基本类型的值是不可变的,引用类型的值是可变的。
1.3.1 基本类型:当一个变量赋值给另一个变量时,会在内存中创建一个新值,而不是两个变量共用一个值。基本数据类型存放在栈中。
var a=10;
var b=a;
console.log(a);//10
console.log(b);//10
b=20;
console.log(a);//10
console.log(b);//20
此时:a中保存的值为10,使用a来初始化b时,b从a那里复制一个副本,此时a与b相互独立,这两个变量可以参加任何操作而相互不受影响。
1.3.2 引用类型:当a变量向b变量赋值引用类型时,会在栈中创建一个b变量,然后将a中存储的内容(a指向的对象的地址)赋值给b,此时b和a中存储的都是同一份地址。两个变量共享一个对象,其中一个变量操作该对象时,两外一个变量也会受影响。
var a=[1,2,3];
var b=a;
a.push(4);
console.log(a); // [1,2,3,4]
console.log(b); // [1,2,3,4]
var a=[1,2,3];
var b=a;
b=[1,2,3,4];
console.log(a); // [1,2,3]
console.log(b); // [1,2,3,4]
因此,引用类型的赋值其实是对象保存在栈区地址指针的赋值,因此两个变量指向同一个对象,任何的操作都会相互影响。
2.基本类型和引用类型的比较
2.1 基本类型的比较:只要它们的值相等就相等。
注意以下情况:
var a=1;
var b=true;
console.log(a==b); //true
console.log(a===b);//false 比较值和类型
使用==的时候,JS会自动进行类型转换,然后比较值。
2.2 引用类型的比较:引用的比较
var person1='{}';
var person2='{}';
console.log(person1===person2); //true
var person1={};
var person2={};
console.log(person1===person2); //false p1和p2为两个独立的对象,内存地址不同,所以值不同
3.基本类型只保存在栈中,引用类型同时保存在栈中和堆中
对于基本类型,直接保存在栈中。对于引用类型,栈中保存变量的标识和指向对象的指针(堆中的地址),堆中存储实际的对象。