Object.assign() 方法浅析
2024-10-21 11:53:49
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()
。
在出现错误的情况下,例如,如果属性不可写,会引发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
最新文章
- gradle
- 【转载】使用Pandas创建数据透视表
- Server-Sent Events(HTML5 服务器发送事件)
- WPF中弹出文件夹浏览对话框
- 全面解析windows下Memcache技术应用
- iOS 字典自动生成模型
- vagrant up时提示 Authentication failure. Retrying
- 数据库索引<;二>; 如何创建索引
- 初识数据字典【weber出品必属精品】
- PHP字节格式化
- db2_errroecode
- vim基本命令(转载自网络)
- first time to use github
- 禁止光盘优盘自动播放(Shell Hardware Detection服务)
- c#devexpress GridContorl datasource为 类字段的实现方式 非datatable方式以及其他操作总结
- 【noip模拟赛3】贾老二的工件 (模拟)
- 《Thinking in Java》习题——吸血鬼数字
- PHP漏洞
- Merkle tree在区块链中的应用
- python 待关注库