浅拷贝
是指复制一份指针,但实际的指向还是同一块内存,只要内存处改变了,指向这个内存的引用都会改变。
- 手写遍历
- Object.assign({}, obj) // obj只有一层的时候(即全为基本数据类型),是深拷贝
- {...obj} 或 [..arr] // obj、arr只有一层的时候(即全为基本数据类型),是深拷贝
- Array.prototype.concat()
- Array.prototype.slice()
- 直接赋值
- lodash里的clone()
深拷贝
是指重新开辟一处内存存放数据,与源数据是两份内存,指针指向也不同。
- structuredClone(obj) // window自带,但不是所有浏览器都支持。前往MDN查看兼容
- JSON.parse(JSON.stringify(obj)) // 值为function、undefined、symbol类型的参数会丢失
- 手写递归,或者第三方递归函数,如lodash里的cloneDeep()
- Object.assign({}, obj) // obj只有一层的时候(即全为基本数据类型),是深拷贝
- {...obj} 或 [...arr] // obj、arr只有一层的时候(即全为基本数据类型),是深拷贝