js的数据类型有数字、字符串、布尔、null、undefined和对象,其中数字、字符串、布尔、null、undefined属于基本数据类型,对象属于引用数据类型。
基本数据类型的存储是存储在栈里的,引用类型是存储在堆里的,然后将堆地址存贮在栈里

复杂数据类型引用

  1. const obj1 = { a: 1 }
  2. const obj2 = obj1

这种情况我们称为obj1和obj2同时引用对象 { a: 1 } 的地址

浅拷贝

对于拷贝来说,是将对象的每一个属性都复制给另外一个对象,如果只是复制最外层的属性,不考虑多层嵌套情况,我们称之为浅拷贝,例如:

  1. // 浅拷贝
  2. const obj = {
  3. a: 1,
  4. b: 2
  5. }
  6. const shallowCopy = value => {
  7. // copy 动作
  8. }
  9. const copyObj = shallowCopy(obj) // { a: 1, b: 2 }

最后拷贝出来的是另一个对象,obj和copyObj地址不一样,但是对于多层嵌套的对象,想要进行完全拷贝,要进行递归,这就是深拷贝的内容

深拷贝

深拷贝是在浅拷贝的基础上,将对象的复杂数据类型的属性进行递归拷贝,实现方法:

  1. // 获取数据类型
  2. const getType = value => {
  3. const objectType = Object.prototype.toString.call(value);
  4. const type = objectType.match(/^\[object (.*)\]$/)[1];
  5. return type.toLowerCase()
  6. }
  7. // 深拷贝
  8. const deepCopy = value => {
  9. let copyValue = value
  10. const type = getType(value)
  11. if (type === 'object') {
  12. copyValue = {}
  13. for (const key in value) {
  14. copyValue[key] = deepCopy(value[key])
  15. }
  16. }
  17. if (type === 'array') {
  18. // copyValue = []
  19. copyValue = value.map(i => deepCopy(i))
  20. }
  21. return copyValue
  22. }
  23. const obj1 = {
  24. a: 1,
  25. b: {
  26. c: 2,
  27. d: [1, 2, 3]
  28. }
  29. }
  30. deepCopy(obj1)

image.png