深拷贝和浅拷贝

数据类型概述

基本的数据类型

数值(number),字符串(string),布尔值(boolean)
至于undefined和null,一般将它们看成两个特殊值

复杂的数据类型

对象是最复杂的数据类型,又可以分为三个子类型

  • 狭义的对象(object)
  • 数组(array)
  • 函数(function)

基本数据类型的拷贝

基本数据类型的值是存入栈内存中的。值与值之间是相互独立存在的,当我们改变了a的值,对b是没有影响的,所以b输出的还是10

1
2
3
4
5
let a = 10;
let b = a;
a = 100;
console.log(a); // 100
console.log(b); // 10

复杂的数据类型拷贝(引用数据类型)

引用数据类型的值是存入堆内存中的,变量a存的是一个对象的内存地址(对象的引用),所以只是把a的内存地址赋值给b,如果两个变量保存的是同一个内存地址(对象的引用),每当通过修改任意一个变量修改属性时,另一个也会受到影响

1
2
3
4
5
6
7
let a = {
age: 10,
};
let b = a;
a.age = 100;
console.log(a.age); // 100
console.log(b.age); // 100
1
2
3
4
5
let a = [1,2,3]
let b = a
a[0] = 100
console.log(a) // [100, 2, 3]
console.log(b) // [100, 2, 3]

深拷贝

如果是基本的数据类型,那么它们之间的拷贝都是深拷贝。如果是引用数据类型,只要把内部的引用类型数据全部都独立开一块内存空间,让它们之间完全不要有共用,数据完全相互不干扰就是深拷贝

浅拷贝

只要内部的引用类型数据有共用,数据会相互干扰就是浅拷贝