1、Object.assign()是什么?

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

tips:在JavaScript中枚举属性简单来说就是指对象中的属性是否可以被遍历出来,是属性的enumerable值决定的

2、基本用法

const target = { a: 1, b: 2 };
const source = { b: 3, c: 4 };
const source2 = { c: 5, d: 6 };const currentTarget = Object.assign(target, source, source2);
console.log(currentTarget);
// currentTarget:  {a: 1, b: 3, c: 5, d: 6}

Object.assign方法的第一个参数是目标对象,后边的其他参数都是源对象;

     tips:

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

2、Object.assign 方法只会拷贝源对象自身的并且可枚举的属性到目标对象。

3、注意目标自身也会改变

如果只有一个参数,Object.assign会直接返回该参数

const target = { a: 1, b: 2 };
const currentTarget = Object.assign(target);
console.log(currentTarget);//{a: 1, b: 2}

该参数不是对象会先转为对象,然后return;(undefined || unll 出现在target(源对象)位置无法转换为对象会报错)

const currentTarget = Object.assign(10);
console.log(currentTarget);//Number {10}

注意,Object.assign 不会在那些source对象值为 null 或 undefined 的时候抛出错误。

其他类型的值(即数值、字符串和布尔值)不在首参数,也不会报错。但是,除了字符串会以数组形式,拷贝入目标对象,其他值都不会产生效果。

const source1 = "aaa";
const source2 = false;
const source3 = 666;const currentTarget = Object.assign({}, source1, source2, source3);
console.log(currentTarget);
//{0: "a", 1: "a", 2: "a"}

Symbol 类型的属性也会被拷贝。

const target = { a: "111" };
const source1 = { [Symbol("6")]: 666 };
const currentTarget = Object.assign(target, source1);
console.log(currentTarget);//{a: "111", Symbol(6): 666}

继承属性和不可枚举属性是不能拷贝的

const obj = Object.create({foo: 1}, { // foo 是个继承属性。bar: {value: 2  // bar 是个不可枚举属性。},baz: {value: 3,enumerable: true  // baz 是个自身可枚举属性。}
});const currentTarget= Object.assign({}, obj);
console.log(currentTarget); // { baz: 3 }

出现异常会打断后续的copy任务

const target = Object.defineProperty({}, "foo", {value: 1,writable: false
}); // target 的 foo 属性是个只读属性。Object.assign(target, {bar: 2}, {foo2: 3, foo: 3, foo3: 3}, {baz: 4});
// TypeError: "foo" is read-only
// 注意这个异常是在拷贝第二个源对象的第二个属性时发生的。console.log(target.bar);  // 2,说明第一个源对象拷贝成功了。
console.log(target.foo2); // 3,说明第二个源对象的第一个属性也拷贝成功了。
console.log(target.foo);  // 1,只读属性不能被覆盖,所以第二个源对象的第二个属性拷贝失败了。
console.log(target.foo3); // undefined,异常之后 assign 方法就退出了,第三个属性是不会被拷贝到的。
console.log(target.baz);  // undefined,第三个源对象更是不会被拷贝到的。

深拷贝问题

针对深拷贝,需要使用其他办法,因为 Object.assign()拷贝的是(可枚举)属性值。

假如源值是一个对象的引用,它仅仅会复制其引用值。

const log = console.log;function test() {let obj1 = { a: 0 , b: { c: 0}};let obj2 = Object.assign({}, obj1);log(JSON.stringify(obj2));// { a: 0, b: { c: 0}}obj1.a = 1;log(JSON.stringify(obj1));// { a: 1, b: { c: 0}}log(JSON.stringify(obj2));// { a: 0, b: { c: 0}}obj2.a = 2;log(JSON.stringify(obj1));// { a: 1, b: { c: 0}}log(JSON.stringify(obj2));// { a: 2, b: { c: 0}}obj2.b.c = 3;log(JSON.stringify(obj1));// { a: 1, b: { c: 3}}log(JSON.stringify(obj2));// { a: 2, b: { c: 3}}// Deep Cloneobj1 = { a: 0 , b: { c: 0}};let obj3 = JSON.parse(JSON.stringify(obj1));obj1.a = 4;obj1.b.c = 4;log(JSON.stringify(obj3));// { a: 0, b: { c: 0}}
}test();

同名属性的替换

对于这种嵌套的对象,一旦遇到同名属性,Object.assign的处理方法是替换,而不是添加。

const target = { a: { b: 'c', d: 'e' } }
const source = { a: { b: 'hello' } }
Object.assign(target, source)
// { a: { b: 'hello' } }

Object.assign()详解相关推荐

  1. Object.assign详解

    目录 一.Object.assign是什么? 二.用法: 三.详细讲解 1.目标对象和源对象没有同名属性 2.目标对象和源对象有同名属性 3.有多个源对象 4.原始类型会被包装为对象 5.对象的拷贝 ...

  2. Oracle PL/SQL存储过程对象类型Object type详解 create type obj_type as object, create table tab_name of obj_type

    原 oracle 对象类型 object type 置顶 2011年06月13日 18:00:00 oypj2010 阅读数:3453 /* 对象类型属于用户自定义的一种复合类型,它封装了数据结构和拥 ...

  3. java 抽象类,接口,object类详解

    抽象类: 如果一个类没有足够的信息去描绘一个具体的对象,那么这个类就可以叫做抽象类. 也可以叫做:可声明抽象方法的类==>抽象类 注意: <1>抽象类不可以实例化对象,所以它只能被继 ...

  4. 1.2 Object类详解

    Object类概述 Object类是所有Java类的根父类 如果在类的声明中未使用extends关键字指明其父类,则默认父类为java.lang.Object类 Object类中的功能(属性.方法)就 ...

  5. java object 详解_Java基础之Object类详解

    类Object是类层次结构的根类.每个类都直接或者间接地继承Object类.所有对象(包括数组)都实现这个类的方法.Object类中的构造方法只有一个,并且是无参构造方法,这说明每个类中默认的无参构造 ...

  6. Object.defineProperty 详解

    最近想了解一下Vue是怎么实现数据双向绑定的,了解到是基于Object.definProperty,在此记录一下. Object.defineProperty 顾名思义,就是给对象定义一个属性,总共有 ...

  7. 安卓 on a null object reference_详解Object.prototype.__proto__

    Object.prototype 的 __proto__ 属性是一个访问器属性(一个getter函数和一个setter函数), 暴露了通过它访问的对象的内部[[Prototype]] (一个对象或 n ...

  8. @synchronized (object)使用详解

    synchronized关键字代表这个方法加锁,相当于不管哪一个线 程A每次运行到这个法时,都要检查有没有其它正在用这个方法的线程B(或者C D等),有的话要等正在使用这个方法的线程B(或者C D)运 ...

  9. Object 对象详解

    2019独角兽企业重金招聘Python工程师标准>>> 面向对象的核心思想:"找合适的对象,做适合的事情". 合适的对象: 1. 自己描述类,自己创建对象. 2. ...

最新文章

  1. ASP.NET那点不为人知的事(四)
  2. 采购申请的评估价格的来源
  3. DELPHI 通過窗口句柄或窗口标题得到进程句柄
  4. 【两种方法】基础实验4-2.7 修理牧场 (25 分)
  5. python小爬虫(爬取职位信息和博客文章信息)
  6. python访问文件下载地址_用Python脚本去获得skydrive上文件的真实地址链接 + 提供脚本下载v2012-01-18...
  7. Spring Cloud实战小贴士:Feign的继承特性(伪RPC模式)
  8. 一文带你看完ZooKeeper!
  9. 小学期Deadline之GEC6818点奶茶系统
  10. Oracle数据库安装与配置
  11. python均线斜率_一根20日均线闯天下? ——量化回测“压箱底指标”
  12. [譯 + 更新] 參透 Node 中 exports 的 7 種設計模式
  13. Autocad 2022版本插件开发基础1
  14. Snipaste截图时下拉菜单消失解决方法
  15. 电脑快捷键你知道多少个?QQ截图快捷键ctrl加什么
  16. Linux平台上DPDK入门指南(二)
  17. 十一、Latex的数学矩阵排版
  18. 无内存启动linux,彻底解决Linux启动无输出问题
  19. 图片按比例缩小,并压缩保存
  20. native Vlan

热门文章

  1. Windows——启用任务计划程序中的历史记录(已禁用)
  2. undefined reference to `__gxx_personality_sj0'错误解决办法
  3. fs::path解释和使用
  4. 加载Torchlight(火炬之光)的layout布局文件
  5. 跟庄买股票得新技巧(第三弹)集合竞价战法
  6. java solarsystem,桌面小游戏二:模拟太阳系solarSystem
  7. CCPC 桂林站总结
  8. 【愚公系列】2023年02月 WMS智能仓储系统-018.收获管理和发货管理(完结篇)
  9. webdriver启动chrome浏览器后打不开URL
  10. 漫谈深度学习在Super Resolution(超分辨率)领域上的应用