Object.assign() 方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。

Object.assign(target, ...sources)    【target:目标对象】,【souce:源对象(可多个)】

1.如果目标对象中的属性具有相同的键,则属性将被源对象中的属性覆盖。后面的源对象的属性将类似地覆盖前面的源对象的属性。

2.Object.assign 方法只会拷贝源对象自身的并且可枚举的属性到目标对象。该方法使用源对象的[[Get]]和目标对象的[[Set]],所以它会调用相关 getter 和 setter。因此,它分配属性,而不仅仅是复制或定义新的属性。如果合并源包含getter,这可能使其不适合将新属性合并到原型中。为了将属性定义(包括其可枚举性)复制到原型,应使用Object.getOwnPropertyDescriptor()和Object.defineProperty() 。

Object.assign()拷贝

当对象中只有一级属性,没有二级属性的时候,此方法为深拷贝,但是对象中有对象的时候,此方法,在二级属性以后就是浅拷贝。

如下,如果当源对象只有一层,并且value为值类型,当用Object.assign()拷贝的时候是深拷贝,拷贝以后,修改源对象的值,目标对象并不会改变,为深拷贝

let a = { b: 1, c: 2 }let result = Object.assign({},a)a.b = 3console.log(result.b) // 打印 1

如果当源对象的value有对象的时候,拷贝以后,修改源对象里面对象的值,目标对象会改变,为浅拷贝

let a = { b: { d: 1, f: 3 }, c: 2 }let result = Object.assign({},a)a.b.d = 33console.log(result.b.d) // 打印 33

Object.assign的拷贝,是对于第一层属性的拷贝。

如下,源对象的value是一个对象,但是我修改的是源对象第一层的的值,并不会对result值产生影响。说明Object.assign的拷贝,只是针对于第一层属性的拷贝。

let a = { b: { d: 1, f: 3 }, c: 2 }let result = Object.assign({},a)a.b = []console.log(result.b.d) // 打印 1

最后写在,深拷贝的写法也有N种,我经常用到的是JSON.parse(JSON.stringify(obj)),或者是使用lodash的深拷贝就得了。

assign深拷贝_Object.assign 深拷贝?浅拷贝?相关推荐

  1. 深拷贝(deep clone)与浅拷贝(shallow clone)

    深拷贝(deep clone)与浅拷贝(shallow clone) 浅复制(浅克隆):被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅复制仅仅复 ...

  2. python复制列表元素_Python学习教程:Python列表赋值,复制,深拷贝及5种浅拷贝详解...

    Python学习教程:Python列表赋值,复制,深拷贝及5种浅拷贝详解 概述 在列表复制这个问题,看似简单的复制却有着许多的学问,尤其是对新手来说,理所当然的事情却并不如意,比如列表的赋值.复制.浅 ...

  3. python中有那几种赋值_详解Python列表赋值复制深拷贝及5种浅拷贝

    概述 在列表复制这个问题,看似简单的复制却有着许多的学问,尤其是对新手来说,理所当然的事情却并不如意,比如列表的赋值.复制.浅拷贝.深拷贝等绕口的名词到底有什么区别和作用呢? 列表赋值 # 定义一个新 ...

  4. Java中的深拷贝(深复制)和浅拷贝(浅复制)

    深拷贝(深复制)和浅拷贝(浅复制)是两个比较通用的概念,尤其在C++语言中,若不弄懂,则会在delete的时候出问题,但是我们在这幸好用的是Java.虽然java自动管理对象的回收,但对于深拷贝(深复 ...

  5. java 对象深拷贝_java深入理解浅拷贝和深拷贝

    简介 拷贝对象是java中经常会遇到的问题.java中存在两种类型,基础类型和引用类型. java的赋值都是传值的,对于基础类型来说,会拷贝具体的内容,但是对于引用对象来说,存储的这个值只是指向实际对 ...

  6. 什么是深拷贝,什么是浅拷贝

    浅拷贝:创建一个新的对象,这个对象有着原始对象属性值的一份精确拷贝,如果属性是基本类型,就拷贝基本类型的值,如果属性是引用对象,那拷贝的就是内存地址,如果其中一个改变了,那么另外一个也会收到影响 深拷 ...

  7. assign深拷贝_经典前端面试题: Object.assign 是浅拷贝还是深拷贝?实现深拷贝的方法有哪些?...

    Object.assign() 方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象.它将返回目标对象. 如果目标对象中的属性具有相同的键,则属性将被源对象中的属性覆盖.后面的源对象的属性将类 ...

  8. assign深拷贝_前端深拷贝和浅拷贝

    在前端攻城狮的工作实际应用中,有很多情况下在处理数据的时候,会用到数据的深拷贝和浅拷贝 例如:vue中数据是双向绑定的,页面显示依赖于从后台获取到的数据,但要将这个数据当做参数发送给另外一个接口的时候 ...

  9. object转成实体对象_Object.assign 原理及其实现

    编者按:本文转载自掘金专栏,由作者 木易杨说 授权奇舞周刊转载. 引言 上篇文章( https://github.com/yygmind/blog/issues/25 )介绍了赋值.浅拷贝和深拷贝,其 ...

最新文章

  1. hibernate merge saveorupdate save lock
  2. java+selenium模拟登陆新浪微博demo
  3. 千万别让海底捞知道你的生日
  4. iOS关键代码遭泄露;Google正式抛弃HTTP;微博网页版出故障 | 一周业界事
  5. android的Service
  6. Ubuntu移除mysql后重新安装
  7. 【心电信号】基于matlab GUI心电信号数字滤波处理【含Matlab源码 484期】
  8. ccc强制性认证是什么?
  9. 关于MATLAB的saveas函数错误
  10. Win11想运行老游戏怎么设置
  11. MySQL备份与恢复
  12. 远程桌面技术之-“你的凭据不工作”
  13. sharepoint 服务器错误: http://go.microsoft.com/fwlink?LinkID=96177
  14. div布局三栏-左中右
  15. 耐得住寂寞,才能守得住繁华
  16. hdu5651 xiaoxin juju needs help(组合数学)
  17. 一分钟为网站添加统计功能
  18. 美通企业周刊 | 湖北与百胜中国签署战略合作协议;喜茶首家环保主题店亮相深圳;万豪2021年将开设中国第400家酒店...
  19. Java多线程开发的实际应用场景
  20. macbook 2020 wintogo 安装驱动问题解决

热门文章

  1. python列表appendtext_python-默认文本以及列表textvariable Entry小部...
  2. python 画三角函数_python,将三角函数绘制成二维数组
  3. 详解nohup和 区别
  4. python中break与continue使用
  5. java从1开始计时用线程_java – Python – 线程,计时或函数使用?
  6. AcWing之重建二叉树
  7. 关于深度学习,我们写了一本1400页的全栈手册
  8. Facebook、阿里等大佬现身说法,NLP是否被高估了?
  9. 开源开放 | 一个融合多元关系和事件表示的金融领域本体模型FTHO(CCKS2021)
  10. 论文浅尝 - ACL2020 | 利用知识库嵌入改进多跳 KGQA