引言
JavaScript 中的变量包含两种不同数据类型的值:基本类型值和引用类型值。基本数据类型指的是简单的数据段,保存在栈内存中;引用数据类型指的是由可能多种类型构成的对象,保存在堆内存中。
ps:基本数据类型由有string
、number
、boolen
、null
、undefined
、symbol
(ES6),引用数据类型比如比如数组Array
、Object
那么数据的存储对于数据的操作有什么影响呢,我们通过下面的代码分析一下。
基本数据类型
let a = 10;
let b = a;
b = 20;
console.log(a,b);
//10,20
如图:
- 在栈内存中的数据发生复制行为时,系统会自动为新的变量分配一个新值。所以在
let b=a
赋值之后,在栈内存空间里已经为b
赋值了一个新的值,他们已经不会相互影响了,在修改b
的值之后,a
的值并不会发生变化。
基本数据类型做赋值操作时,进行的是“值传递”。
引用数据类型
let obj1 = { name:'zhangsan' , age : 20 };
let obj2 = obj1;
obj2.name = 'lisi';
console.log(obj1,obj2);
//{ name:'lisi' , age : 20 },{ name:'lisi' , age : 20 }
如图:
-
我们通过
let ojb2 = obj1
的时候,系统会执行一次引用类型的复制操作,引用类型的复制也会为新的值(obj2)分配一个值保存在栈内存中去。不同的是,这个新的值指向的是引用类型的一个地址指针,当地址指针指向堆内存的同一个地方的时候,他们就会相互依赖,所以在堆内存访问到的对象其实是同一个。 -
当我们修改
obj2
的值的时候,其实就是修改栈内存中obj2
指向的这个对象,同时obj1
也指向的是这个对象,所以更改之后,obj1
,obj2
的值都会发生变化。
引用数据类型做赋值操作时,进行的是“址传递”。
结语
所以,记住这个口诀:
基本数据类型 | 引用数据类型 |
---|---|
值传递 | 址传递 |