beizhu
type
Post
status
Published
date
Feb 15, 2018
slug
summary
对于字符串类型,浅复制是对值的复制,对于对象来说,浅复制是对对象地址的复制,并没有开辟新的栈,也就是复制的结果是两个对象指向同一个地址,修改其中一个对象的属性,则另一个对象的属性也会改变,而深复制则是开辟新的栈,两个对象对应两个不同的地址,修改一个对象的属性,不会改变另一个对象的属性。
tags
JS
category
技术
icon
password
深拷贝和浅拷贝
- 深拷贝:拷贝实例;浅拷贝:拷贝引用(原对象)。
- JavaScript的变量类型:
- 基本类型:undefined、null、Boolean、number、string。变量直接按指存放在栈区内,可以直接访问,所以我们平时把字符串、数字的值赋值给新变量,相当于把值完全复制过去,新变量的改变不会影响旧变量。
- 引用类型:存放在堆区的对象,变量在栈区中保存的是一个指针地址。
- 例子
- 深拷贝和浅拷贝图解
- 浅拷贝实现方式
- 函数实现
- 最简单的浅拷贝:变量复制
- 通过es6新增的Object.assign来复制对象
- jquey中的$.extend({}, obj); Array.prototype.slice()和Array.prototype.concat()都会返回一个数组或者对象的浅拷贝。(看起来像深拷贝)
- 深拷贝实现
- 函数实现
//因为浅复制只会将对象的各个属性进行依次复制,并不会进行递归复制,而 JavaScript 存储对象都是存地址的,所以浅复制会导致 o3.key 和 o1.key 指向同一块内存地址
- JSON对象中的parse和stringify,JOSN对象中的stringify可以把一个js对象序列化为一个JSON字符串,parse可以把JSON字符串反序列化为一个js对象,通过这两个方法,也可以实现对象的深复制。