JS相关知识学习笔记(补充)——对象的直接赋值、浅拷贝和深拷贝

1、直接进行赋值

(1)对于一个复杂数据类型a,直接将它赋值给另一个变量b,两个变量将指向同一个地址,值会完全一样,改变任何一个变量的任何一个属性值,另一个也会随之改变

(2)先把a的值赋给b,之后再把另一个数据整体赋值给b,则a不变,b则指向新赋值的变量地址

var a = {
  name:'zs',
  age: 18
}
var b = a
console.log(a)  // {name: 'zs', age: 18}
console.log(b)  // {name: 'zs', age: 18}
b.name = 'ls'
console.log(a)  // {name: 'ls', age: 18}
console.log(b)  // {name: 'ls', age: 18}

b = [1, 2, 3]
console.log(a)  // {name: 'ls', age: 18}
console.log(b)  // [1, 2, 3]
2、对象的浅拷贝

对一个对象进行浅拷贝时:

对象中的简单数据类型,拷贝的时候会重新分配一个内存地址,修改新对象或旧对象的属性值,对另外一个没有任何影响

对象中的复杂数据类型,拷贝的时候依旧指向同一个内存地址,修改新对象或旧对象的属性值,另一个也会随之改变

var obj = {
  name:'zs',
  age: 18,
  msg: {
    hobby: 'sing'
  }
}

var o = {}

// 浅拷贝方式1
for (var k in obj) {
  o[k] = obj[k]
}

// 浅拷贝方式2
Object.assign(o, obj)

o.age = 20
o.msg.hobby = 'dance'

console.log(o)  // {name: 'zs', age: 20, msg: {hobby: 'dance'}}
console.log(obj)  // {name:'zs', age: 18, msg: {hobby: 'dance'}}

/** 单独修改了o对象中的普通数据类型age,修改o中的复杂数据类型,两个都被修改 */
3、对象的深拷贝

对一个对象进行深拷贝:

(1)对象中可能会有复杂数据类型,对于复杂数据类型得一层一层进行拷贝,需要用到递归

(2)数组和对象都属于复杂数据类型,因此要分情况进行判断讨论

(3)函数一般直接拷贝,避免内存浪费,最好指向同一地址,复用性强

var obj = {
  name:'zs',
  age: 18,
  msg: {
    hobby: 'sing',
    fruit: 'apple'
  }
}

var o = {}

function deepCopy(newObj, oldObj) {
  for (var k in oldObj) {
    var item = oldObj[k]
    
    if (item instanceof Array) {  // 先判断是不是数组,如果是,需要继续调用函数
      newObj[k] = []  // 准备一个空数组,作为下一层递归的第一个参数
      deepCopy(newObj[k], oldObj[k])
    } else if (item instanceof Object) {  // 先判断是不是对象,如果是,需要继续调用函数
      newObj[k] = {}  // 准备一个空对象,作为下一层递归的第一个参数
      deepCopy(newObj[k], oldObj[k])
    } else {  //  简单数据类型以及函数直接进行拷贝
      newObj[k] = oldObj[k]
    }
  }
}

deepCopy(o, obj)

o.msg.hobby = 'dance'
obj.msg.fruit = 'mongo'

console.log(o)  // {name: 'zs', age: 18, msg: {hobby: 'dance', fruit: 'apple'}}
console.log(obj)  // {name: 'zs', age: 18, msg: {hobby: 'sing', fruit: 'mongo'}}

/** 分别修改了o中的msg.hobby和obj中的msg.fruit,均修改成功,相互不影响 */
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 写在前面 各类技术论坛关于深拷贝的博客有很多,有些写的也比我好,那为什么我还要坚持写这篇博客呢,之前看到的一篇博客...
    Leson17阅读 169评论 0 0
  • 我是黑夜里大雨纷飞的人啊 1 “又到一年六月,有人笑有人哭,有人欢乐有人忧愁,有人惊喜有人失落,有的觉得收获满满有...
    陌忘宇阅读 8,782评论 28 54
  • 信任包括信任自己和信任他人 很多时候,很多事情,失败、遗憾、错过,源于不自信,不信任他人 觉得自己做不成,别人做不...
    吴氵晃阅读 6,317评论 4 8
  • 怎么对待生活,它也会怎么对你 人都是哭着来到这个美丽的人间。每个人从来到尘寰到升入天堂,整个生命的历程都是一本书,...
    静静在等你阅读 5,182评论 1 6

友情链接更多精彩内容