1. 定义

深拷贝:针对属性值是引用类型,会再次遍历每个属性,将属性复制过来,是一个递归的过程,会开辟新的堆内存,两者完全分离。
浅拷贝:针对属性值是引用类型,会直接将引用复制过来,这样我们无论在新旧数组进行了修改,两者都会发生变化。

2. 利用原生方法实现

2.1 浅拷贝

  1. let newArr = array.concat()
  2. let newArr = array.slice()
  3. let newArr = array.splice(0)
  4. let newArr = [...array]

2.2 深拷贝

  1. let newArr = JSON.parse(JSON.stringify(array))

3. 自定义实现

3.1 浅拷贝

  1. function shadowCopy(obj) {
  2. if(typeof obj !== 'object') {
  3. return
  4. }
  5. let ret = obj instanceof Array? [] : {}
  6. for(key in obj) {
  7. if(obj.hasOwnProperty(key)) {
  8. ret[key] = obj[key]
  9. }
  10. }
  11. return ret
  12. }

3.2 深拷贝

  1. function deepCopy(obj) {
  2. if(typeof obj !== 'object') {
  3. return
  4. }
  5. let ret = obj instanceof Array? [] : {}
  6. for(let key in obj) {
  7. if(obj.hasOwnProperty(key)) {
  8. ret[key] = typeof obj[key] === 'object' && obj[key] !== null?
  9. deepCopy(obj[key]) :
  10. obj[key]
  11. }
  12. }
  13. return ret
  14. }