在JavaScript中,我们可以分成两种类型:基本类型和引用类型
1.基本类型
基本类型主要为以下6种:
Number
String
Boolean
Undefined
null
symbol
2.引用类型
Object(创建 object 常⽤⽅式为对象字⾯量表⽰法,属性名可以是字符串或数值)
Array(JavaScript 数组是⼀组有序的数据,但跟其他语⾔不同的是,数组中每个槽位可以存储任意类型的数据。并且,数组也是动态⼤⼩的,会随着数据添加⽽⾃动增⻓)
Function(函数实际上是对象,每个函数都是 Function 类型的实例,⽽ Function 也有属性和⽅法,跟其他引⽤类型⼀样)
还包括Date、RegExp、Map、Set等
存储区别
基本数据类型和引用数据类型存储在内存中的位置不同:
基本数据类型存储在栈中
引用类型的对象存储于堆中
下面举个例子
1.基本类型
let a = 10;
let b = a; // 赋值操作
b = 20;
console.log(a); // 10值console.log(a); // 10值
a 的值为⼀个基本类型,是存储在栈中,将 a 的值赋给 b ,虽然两个变量的值相等,但是两个变量
保存了两个不同的内存地址
2. 引⽤类型
var obj1 = {}
var obj2 = obj1;
obj2.name = "Xxx";
console.log(obj1.name); // xxx引⽤类型数据存放在堆中,每个堆内存对象都有对应的引⽤地址指向它,引⽤地址存放在栈中。
obj1 是⼀个引⽤类型,在赋值操作过程汇总,实际是将堆内存对象在栈内存的引⽤地址复制了⼀份
给了 obj2 ,实际上他们共同指向了同⼀个堆内存对象,所以更改 obj2 会对 obj1 产⽣影响
小结
声明变量时不同的内存地址分配:
简单类型的值存放在栈中,在栈中存放的是对应的值
引⽤类型对应的值存储在堆中,在栈中存放的是指向堆内存的地址
不同的类型数据导致赋值变量时的不同:
简单类型赋值,是⽣成相同的值,两个对象对应不同的地址
复杂类型赋值,是将保存对象的内存地址赋值给另⼀个变量。也就是两个变量指向堆内存中同⼀个对象