JavaScript 中基本类型的数据和引用类型的数据除了在表现形式上不同外,还有一个更大的区别在于数据存储。从《JavaScript 内存空间》中我们已经知道,基本类型的数据值保存在栈内存中,引用类型的数据值保存在堆内存中。
那么数据的存储位置不同对于数据操作到底有什么影响呢?我们通过实际代码例子来分析一下:
基本类型
例一:
|
|
图解:
在栈内存中的数据发生复制行为时,系统会自动为新的变量分配一个新值。var b = a
执行之后,a
和 b
的值虽然都等于 20,但是他们其实已经是相互独立互不影响的值了。所以,我们修改了 b
的值以后,a
的值并不会发生变化。
基本数据类型做赋值操作时,进行的“值传递”。
引用类型
例二:
|
|
图解:
当我们通过 var person2 = person1
执行一次复制引用类型的操作时,引用类型的复制也会为新的变量分配一个新的值保存在栈内存中。但不同的是,这个新的值,仅仅只是引用类型的一个地址指针。当地址指针相同时,尽管他们相互独立,但是这两个地址指针指向的都是堆内存中的同一个地方,所以在堆内存中访问到的具体对象实际上是同一个。
因此,当我们改变 person2
的时候,就是在改变堆内存中 person2
指向的这个对象。而同时,person1
指向的也是这个对象,所以 person1
也会跟着发生变化。这就是引用类型的特性。
引用数据类型做赋值操作时,进行的“址传递”。