https://juejin.im/post/5b5dcf8351882519790c9a2e
https://segmentfault.com/a/1190000016672263 ,这个博主写的很不错可以看看。

数据分为基本数据类型(String, Number, Boolean, Null, Undefined,Symbol)和对象数据类型。

  • 基本数据类型的特点:直接存储在栈(stack)中的数据
  • 引用数据类型的特点:存储的是该对象在栈中引用,真实的数据存放在堆内存里

image.png
双胞胎的父母:堆内存声明一个新的对象
对象的赋值类似身体和影子的关系,相互影响。我们可以在这里做文章,如果想让对象之间相互影响,就让他们进行直接赋值,如果我们不想让他们相互影响,我们就让女娲重新创建双胞胎的父母。保证孩子出生的时候一样,往后的日子互不影响。

浅拷贝(只是进行一层拷贝)

  1. var person = {
  2. name: "taowuhua",
  3. age: 18,
  4. sex: "male"
  5. }
  6. var son ={}
  7. function Clone(origin, target) {
  8. var target = target || {};
  9. for (var prop in origin) {
  10. target[prop] = origin[prop]
  11. }
  12. return target
  13. }
  14. Clone(person,son)

深拷贝

互不影响,原始类型不用管,引用类型区分新array还是object
原始值是栈内存引用直接拷贝,
1)判断是不是原始值
2)判断是数组还是对象
3)建立相应的数组或者对象
4)当建立空数组之后把原来的数据党组原始值,新创建的数组或者对象进行上面的方法循环,据需判断是不是原始类型,然后进行相应的判断

  1. var obj = {
  2. name: "taowuhua",
  3. age: 18,
  4. card: ["visa", "master"],
  5. wife: {
  6. name: "mafengshui",
  7. son: {
  8. name: "andy"
  9. }
  10. }
  11. }
  12. var obj1 = {
  13. }
  14. function deepClone(origin, target) {
  15. var target = target || {}
  16. var toStr = Object.prototype.toString
  17. var arrStr = "[object Array]"
  18. //判断是不是原始值
  19. for (var prop in origin) {
  20. if (origin.hasOwnProperty[prop]) {
  21. if (typeof origin[prop] === 'object' && origin[prop] !== null) {
  22. if (toStr.call([origin[prop]) == Array]) {
  23. target[prop] = []
  24. } else {
  25. target[prop] = {}
  26. }
  27. deepClone(origin[prop], target[prop])
  28. } else {
  29. target[prop] = origin[prop]
  30. }
  31. }
  32. }
  33. return target
  34. }