基本类型和引用类型

JavaScript 中基本类型的数据和引用类型的数据除了在表现形式上不同外,还有一个更大的区别在于数据存储。从《JavaScript 内存空间》中我们已经知道,基本类型的数据值保存在栈内存中,引用类型的数据值保存在堆内存中。

那么数据的存储位置不同对于数据操作到底有什么影响呢?我们通过实际代码例子来分析一下:

基本类型

例一:

1
2
3
4
var a = 20;
var b = a; // 将 a 的数据复制给 b
b = 30;
console.log(a);

图解:

在栈内存中的数据发生复制行为时,系统会自动为新的变量分配一个新值。var b = a 执行之后,ab 的值虽然都等于 20,但是他们其实已经是相互独立互不影响的值了。所以,我们修改了 b 的值以后,a 的值并不会发生变化。

基本数据类型做赋值操作时,进行的“值传递”。

引用类型

例二:

1
2
3
4
var person1 = { name: "zhangsan", age: 20 };
var person2 = person1; // 将 person1 的值复制给 person2
person2.name = "lisi";
console.log(person1.name);

图解:

当我们通过 var person2 = person1 执行一次复制引用类型的操作时,引用类型的复制也会为新的变量分配一个新的值保存在栈内存中。但不同的是,这个新的值,仅仅只是引用类型的一个地址指针。当地址指针相同时,尽管他们相互独立,但是这两个地址指针指向的都是堆内存中的同一个地方,所以在堆内存中访问到的具体对象实际上是同一个。

因此,当我们改变 person2 的时候,就是在改变堆内存中 person2 指向的这个对象。而同时,person1 指向的也是这个对象,所以 person1 也会跟着发生变化。这就是引用类型的特性。

引用数据类型做赋值操作时,进行的“址传递”。

我 秦始皇 打钱