浅拷贝和深拷贝是什么,如何手动实现深拷贝

浅拷贝

对于字符串等简单类型的数据来说,浅拷贝就是赋值运算,而对于对象等引用类型的数据来说浅拷贝是对他们的地址的复制。

深拷贝

深拷贝主要是对引用类型的数据说的,深拷贝的主要目的是重新开辟一个栈,俩个数据结构对应俩个不同的地址,修改其中之一,对另一个完全没有影响。

实现深拷贝的方式

JSON.Stringfy

JSON.Stringfy是实现数据拷贝的一种方式,但是该方法也是有坑的:

  • 当对象中存在NaN,Infinity,-Infinity的时候,将会被转为null;
  • 当对象中存在时间对象,JSON.parse(JSON.stringify(obj))之后,时间对象变成了字符串;
  • 当对象中存在RegExp、Error对象,则序列化的结果将只得到空对象;
  • 当对象中存在函数,undefined,则序列化的结果会把函数, undefined丢失;

不考虑循环引用

1
2
3
4
5
6
7
8
9
10
var deepClone = (item) => {
if (typeof item !== 'object' || item === null) {
return item
}
let result = Array.isArray(item) ? [] : {}
for (let key in item) {
result[key] = deepClone(item[key])
}
return result
}

有循环引用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
let obj = {
a: 1,
b: 2,
c: obj
}
var deepClone = (item) => {
const copy = {}
const set = new Set()
for (let [key, value] of Object.entries(item)) {
if (Object(value) !== value) {
copy[key] = value
} else {
if (set.has(value)) {
copy = {...value}
} else {
set.add(value)
copy[key] = deepClone(value)
}
}
}
return copy
}

That’s all!

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2015-2022 Lee
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信