JS中对象存储在堆中,对象赋值给变量的过程中实际是把对象在堆中的地址赋值给变量。所以在将一个对象赋值给多个变量时实际是地址赋值给多个变量,实际是一个对象。在改变对象内值得同时如不进行深拷贝也会影响到其他变量。
深拷贝实现
JSON.sringify 和 JSON.parse
1 | // 将对象转换为字符串,在通过parse进行解析重新建立对象 |
弊端:
- 不能复制function、正则、Symbol、Error对象
- 循环引用报错
- 相同的引用会被重复复制
- 如果是时间对象将会得到字符串,而不再是一个时间对象
递归实现深拷贝
1 | function deepcopy(obj) { |