基本类型与复杂类型
ECMAScript变量可能包含两种不同数据类型的值:基本类型值和引用类型值。基本类型值指的是那些保存在栈内存中的简单数据段,即这种值完全保存在内存中的一个位置。而引用类型值是指那些保存堆内存中的对象,意思是变量中保存的实际上只是一个指针,这个指针指向内存中的另一个位置,该位置保存对象。
打个比方,基本类型和复杂类型在赋值上的区别可以按“连锁店”和“单店”来理解:基本类型赋值等于在一个新的地方安装连锁店的规范标准新开一个分店,新开的店与其他旧店互不相关,各自运营;而引用类型赋值相当于一个店有两把钥匙,交给两个老板同时管理,两个老板的行为都有可能对一间店的运营造成影响。
深拷贝与浅拷贝的概念只存在于复杂数据类型。因为基本数据类型的简单的赋值就是深拷贝。
定义
- 浅拷贝:拷贝原对象/原方法的第一层属性(把对象的属性当做一个树,第一层属性就是最上面的一层节点)。如果第一层的属性是基本类型,新值原值互不影响(就像深拷贝一样)。如果第一层的属性是复杂类型,那么拷贝的是它的栈内存的地址。
- 深拷贝:创建一个新对象/数组,把原对象/原数组整个拷贝出来。在栈内存中有新的地址,在堆内存中也有新的一块区域。
需要注意的是,如果对象比较大,层级也比较多,深拷贝会带来性能上的问题。在遇到需要采用深拷贝的场景时,可以考虑有没有其他替代的方案。在实际的应用场景中,也是浅拷贝更为常用。
为什么要使用深拷贝?
我们希望在改变新的数组(对象)的时候,不改变原数组(对象)。
网友评论