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

const target = { a: 1, b: 2 ,c:3,e:6};
const source = { b: 4, c: 5 }; const returnedTarget = Object.assign(target, source); console.log(target);
// expected output: Object { a: 1, b: 4, c: 5, e: 6 } console.log(returnedTarget);
// expected output: Object { a: 1, b: 4, c: 5, e: 6 }

语法

Object.assign(target, ...sources)

参数

target

  目标对象。

sources

  源对象。

返回值

  目标对象。

描述

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

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

String类型和 Symbol 类型的属性都会被拷贝。

在出现错误的情况下,例如,如果属性不可写,会引发TypeError,如果在引发错误之前添加了任何属性,则可以更改target对象。

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

示例

针对深拷贝,需要使用其他办法,因为 Object.assign()拷贝的是属性值。假如源对象的属性值是一个对象的引用,那么它也只指向那个引用。

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

参考文章:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/assign

最新文章

  1. gradle
  2. 【转载】使用Pandas创建数据透视表
  3. Server-Sent Events(HTML5 服务器发送事件)
  4. WPF中弹出文件夹浏览对话框
  5. 全面解析windows下Memcache技术应用
  6. iOS 字典自动生成模型
  7. vagrant up时提示 Authentication failure. Retrying
  8. 数据库索引<二> 如何创建索引
  9. 初识数据字典【weber出品必属精品】
  10. PHP字节格式化
  11. db2_errroecode
  12. vim基本命令(转载自网络)
  13. first time to use github
  14. 禁止光盘优盘自动播放(Shell Hardware Detection服务)
  15. c#devexpress GridContorl datasource为 类字段的实现方式 非datatable方式以及其他操作总结
  16. 【noip模拟赛3】贾老二的工件 (模拟)
  17. 《Thinking in Java》习题——吸血鬼数字
  18. PHP漏洞
  19. Merkle tree在区块链中的应用
  20. python 待关注库

热门文章

  1. 【rust】rsut基础:模块的使用一、mod 关键字、mod.rs 文件的含义等
  2. websocket-sharp 实现websocket
  3. 国内怎么玩 ChatGPT
  4. 使用nvm时报错:exit status 1: ļ Ѵ ʱ ޷ ļ 的解决办法
  5. catkin_make设置编译并行数
  6. 用Python绘图(数据分析与挖掘实战)
  7. Vulhub 漏洞学习之:Drupal
  8. CenterOS7上搭建RabbitMQ集群
  9. xr32f429开发环境搭建
  10. 优秀PHP程序员技术成长之路