JS深拷贝
js对象是引用类型,对于=
直接赋值的场景,复制的是存在栈内存里面的引用指针,并不是存放在堆内存中的内容,当对一个对象下面的属性值进行修改时,所有的都会变化。
浅拷贝
可以解决一般问题,如果对象只有一层,可以使用浅拷贝。以下几种方式可以实现浅拷贝:
Object.assign()
...
扩展运算符
Object.assign
Object.assign
...
扩展运算符
...
扩展运算符深复制
深复制想实现把对象里面属性值也给复制,当修改复制后的对象某个属性值时,原对象对应的属性值不会被修改。
有以下几种:
JSON的全局对象
parse
和stringify
方法(有限制)遍历实现深度复制
JSON的全局对象parse
和stringify
方法
parse
和stringify
方法这种方法好处是非常简单易用,对于Number
, String
,Object
等来说基本实现。但是坏处也显而易见,对于正则表达式类型、函数类型等无法进行深拷贝(而且会直接丢失相应的值)。还有一点不好的地方是它会抛弃对象的constructor,也就是深复制之后,无论这个对象原本的构造函数是什么,在深复制之后都会变成Object
。
递归遍历实现深复制
通过遍历到对象的每一层,实现深度复制,对引用类型中的function,reg,Date特殊处理。推荐使用
Last updated