关于JS中的Object.assign() 拷贝用法

Object.assign()

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

那什么是可枚举的变量: 你可以理解为可以用 for…in…遍历的变量。就是enumerable:true 时的变量

注意几点:

  1. 首先它是拷贝可迭代的对象。如: String, Object以及可枚举的Symbol
  2. 拷贝的源对象,到目标对象时,同样的key,目标对象key的值会被源对象覆盖
  3. 它并不是一个深拷贝,可枚举属性的值包含其他引用类型的对象,指针还是共同的指着这个对象。

看几个例子

(1) 覆盖

const target = { a: 1, b: 2 };
const source = { b: 4, c: 5 };

const returnedTarget = Object.assign(target, source);

console.log(target);
// expected output: Object { a: 1, b: 4, c: 5 }

console.log(returnedTarget);
// expected output: Object { a: 1, b: 4, c: 5 }

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

const log = console.log;
let obj1 = { a: 0 , b: { c: 0}};
let obj2 = Object.assign({}, obj1);

obj1.a = 1;
log(JSON.stringify(obj1));
// { a: 1, b: { c: 0}}
log(JSON.stringify(obj2));
// { a: 0, b: { c: 0}}

obj2.b.c = 3; // b是一个引用对象
log(JSON.stringify(obj1));
// { a: 0, b: { c: 3}}
log(JSON.stringify(obj2));
// { a: 0, b: { c: 3}}

(3)不可枚举的属性变量 无法拷贝

const v1 = "abc";
const v2 = true;
const v3 = 10;
const v4 = Symbol("foo")

const obj = Object.assign({}, v1, null, v2, undefined, v3, v4);
// 原始类型会被包装,null 和 undefined 会被忽略。
// 注意,只有字符串的包装对象才可能有自身可枚举属性。
console.log(obj); // { "0": "a", "1": "b", "2": "c" }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
JavaScriptObject.assign()方法用于将一个或多个源对象的可枚举属性的值复制到目标对象,并返回目标对象。该方法的语法为Object.assign(target, ...sources),其target是目标对象,而sources是一个或多个源对象。 当使用Object.assign()方法时,如果源对象和目标对象有相同的属性名,后面的源对象的属性值将会覆盖前面的属性值。例如,如果有两个源对象obj1和obj2,其obj1的name属性为"zhangsan",obj2的name属性为"yunchong",那么使用Object.assign()方法后的目标对象的name属性值将为"yunchong"。 就像在引用的代码示例所展示的一样,Object.assign()方法可以用来创建一个目标对象的浅拷贝。使用Object.assign({}, obj)可以将obj对象的属性复制到一个新的空对象,并返回该新对象。 总而言之,JavaScriptObject.assign()方法是用来复制源对象的可枚举属性到目标对象的方法。它可以用于创建目标对象的浅拷贝,并且在合并属性时后面的源对象会覆盖前面的属性值。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [js 关于 Object.assign的讲解 (觉得会用就行了嘛?你不知道的东西在这里,一位重视 js 基础的前端小菜鸟...](https://blog.csdn.net/yunchong_zhao/article/details/108824105)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [jsObject.assign用法示例分析](https://download.csdn.net/download/weixin_38711643/13133673)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值