Object.assign()的使用
一、Object.assign()对象的拷贝
1 Object.assign() 方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。
2 Object.assign(target, ...sources) 【target:目标对象】,【souce:源对象(可多个)】
3 举个栗子:
4 const object1 = {
5 a: 1,
6 b: 2,
7 c: 3
8 };
9
10 const object2 = Object.assign({c: 4, d: 5}, object1);
11
12 console.log(object2.c, object2.d);
13 console.log(object1) // { a: 1, b: 2, c: 3 }
14 console.log(object2) // { c: 3, d: 5, a: 1, b: 2 }
15
16 注意:
17 1.如果目标对象中的属性具有相同的键,则属性将被源对象中的属性覆盖。后面的源对象的属性将类似地覆盖前面的源对象的属性
18 2.Object.assign 方法只会拷贝源对象自身的并且可枚举的属性到目标对象。该方法使用源对象的[[Get]]和目标
19 对象的[[Set]],所以它会调用相关 getter 和 setter。因此,它分配属性,而不仅仅是复制或定义新的属性。如
20 果合并源包含getter,这可能使其不适合将新属性合并到原型中。为了将属性定义(包括其可枚举性)复制到
21 原型,应使用Object.getOwnPropertyDescriptor()和Object.defineProperty() 。
二、Object.assign()对象的深拷贝
1 针对深拷贝,需要使用其他办法,因为 Object.assign()拷贝的是属性值。假如源对象的属性值是一个对象的引用,那么它也只指向那个引用。
2 let obj1 = { a: 0 , b: { c: 0}};
3 let obj2 = Object.assign({}, obj1);
4 console.log(JSON.stringify(obj2)); // { a: 0, b: { c: 0}}
5
6 obj1.a = 1;
7 console.log(JSON.stringify(obj1)); // { a: 1, b: { c: 0}}
8 console.log(JSON.stringify(obj2)); // { a: 0, b: { c: 0}}
9
10 obj2.a = 2;
11 console.log(JSON.stringify(obj1)); // { a: 1, b: { c: 0}}
12 console.log(JSON.stringify(obj2)); // { a: 2, b: { c: 0}}
13
14 obj2.b.c = 3;
15 console.log(JSON.stringify(obj1)); // { a: 1, b: { c: 3}}
16 console.log(JSON.stringify(obj2)); // { a: 2, b: { c: 3}}
17 最后一次赋值的时候,b是值是对象的引用,只要修改任意一个,其他的也会受影响
18
19 // Deep Clone (深拷贝)
20 obj1 = { a: 0 , b: { c: 0}};
21 let obj3 = JSON.parse(JSON.stringify(obj1));
22 obj1.a = 4;
23 obj1.b.c = 4;
24 console.log(JSON.stringify(obj3)); // { a: 0, b: { c: 0}}
3、对象的合并
1 const o1 = { a: 1 };
2 const o2 = { b: 2 };
3 const o3 = { c: 3 };
4
5 const obj = Object.assign(o1, o2, o3);
6 console.log(obj); // { a: 1, b: 2, c: 3 }
7 console.log(o1); // { a: 1, b: 2, c: 3 }, 注意目标对象自身也会改变。
8 其实就是对象的拷贝,o1就是目标对象,后面的是源对象,后面的属性等会拷贝到目标对象
4、合并具有相同属性的对象
1 const o1 = { a: 1, b: 1, c: 1 };
2 const o2 = { b: 2, c: 2 };
3 const o3 = { c: 3 };
4
5 const obj = Object.assign({}, o1, o2, o3);
6 console.log(obj); // { a: 1, b: 2, c: 3 }
7 1.属性被后续参数中具有相同属性的其他对象覆盖。
8 2.目标对象的属性与源对象的属性相同,源的会覆盖目标的属性
5.继承属性和不可枚举属性是不能拷贝
1 const obj = Object.create({foo: 1}, { // foo 是个继承属性。
2 bar: {
3 value: 2 // bar 是个不可枚举属性。
4 },
5 baz: {
6 value: 3,
7 enumerable: true // baz 是个自身可枚举属性。
8 }
9 });
10 创建对象时,如果没有设置enumerable的值,默认为false(不可枚举属性),设置为true,则为可枚举属性
11 const copy = Object.assign({}, obj);
12 console.log(copy); // { baz: 3 }
6.原始类型会被包装为对象
1 const v1 = "abc";
2 const v2 = true;
3 const v3 = 10;
4 const v4 = Symbol("foo")
5
6 const obj = Object.assign({}, v1, null, v2, undefined, v3, v4);
7 // 原始类型会被包装,null 和 undefined 会被忽略。
8 // 注意,只有字符串的包装对象才可能有自身可枚举属性。
9 console.log(obj); // { "0": "a", "1": "b", "2": "c" }
7.异常会打断后续拷贝任务
1 const target = Object.defineProperty({}, "foo", {
2 value: 1,
3 writable: false
4 }); // target 的 foo 属性是个只读属性。
5
6 Object.assign(target, {bar: 2}, {foo2: 3, foo: 3, foo3: 3}, {baz: 4});
7 // TypeError: "foo" is read-only
8 // 注意这个异常是在拷贝第二个源对象的第二个属性时发生的。
9
10 console.log(target.bar); // 2,说明第一个源对象拷贝成功了。
11 console.log(target.foo2); // 3,说明第二个源对象的第一个属性也拷贝成功了。
12 console.log(target.foo); // 1,只读属性不能被覆盖,所以第二个源对象的第二个属性拷贝失败了。
13 console.log(target.foo3); // undefined,异常之后 assign 方法就退出了,第三个属性是不会被拷贝到的。
14 console.log(target.baz); // undefined,第三个源对象更是不会被拷贝到的。
PS: 网上看到的,这里转来记录学习下,转自: https://www.jianshu.com/p/f9ec860ecd81
Object.assign()的使用的更多相关文章
- Object.assign方法复制或合并对象
Object.assign() 方法可以把任意多个的源对象自身的可枚举属性拷贝给目标对象,然后返回目标对象 var obj = { a: 1 }; var copy = Object.assign({ ...
- Object.assign()方法
对象的扩展 1.ES6中,对象的属性和方法可简写:对象的属性值可不写,前提是属性名已经声明: var name = "zhangsan"; "; var obj = { ...
- 微信不支持Object.assign
微信不支持Object.assign,让我Vue怎么用QAQ... 解决方法: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Refe ...
- object.assign()方法的使用
地址:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/assign
- [Javascript] Object.assign()
Best Pratices for Object.assign: http://www.cnblogs.com/Answer1215/p/5096746.html Object.assign() ca ...
- [Redux] Avoiding Object Mutations with Object.assign() and ...spread
Learn how to use Object.assign() and the spread operator proposed for ES7 to avoid mutating objects. ...
- [ES6] Object.assign (with defaults value object)
function spinner(target, options = {}){ let defaults = { message: "Please wait", spinningS ...
- Object.assign()
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/assign 说明 Ob ...
- 学习Object.assign()
Object.assign()用于将所有可枚举的值从一个或多个源对象复制到目标对象.它将返回目标对象. 语法 Object.assign(target, ...source); var obj = { ...
- es6 Object.assign
ES6 Object.assign 一.基本用法 Object.assign方法用来将源对象(source)的所有可枚举属性,复制到目标对象(target).它至少需要两个对象作为参数,第一个参数是目 ...
随机推荐
- js 原生功底 (一)
欢迎大家一起学习,点击查看
- 初学WebGL引擎-BabylonJS:第6篇-碰撞交错与挑选
[playground]-collisions(碰撞) 先贴官方源码(机器翻译版本) var createScene = function () { var scene = new BABYLON.S ...
- 深入理解计算机系统 Start && 第一章要点
对此书已经慕名已久了,抽空看了第1,2,3,5章,其他章节等有空闲继续看吧. 我的许多博客是给自己快速复习使用的,比如此读书后感,你可以根据我下面的建议读完原书几章再回来复习一下(或许那时候就没必要回 ...
- 【平台开发】— 2.前端:vue-element-admin
前端我虽然没怎么写过,但也并不陌生.之前做web自动化,网页结构没少看,html,css,js也都断断续续了解过. 如果从空白开始写,肯定还是需要花不少时间的. 好在网上有了不少成熟的后台系统的前端脚 ...
- 数据库系统第六章【关系数据理论】(B站视频)
目录 数据库系统第六章[关系数据理论](B站视频) 一.前言 二.规范化 函数依赖 三种分类 如何确定函数依赖? 平凡函数依赖vs非平凡函数依赖 完全函数依赖vs部分函数依赖 传递函数依赖 码 超码 ...
- Mybatis实例增删改查(二)
创建实体类: package com.test.mybatis.bean; public class Employee { private Integer id; private String las ...
- Kubernetes-12:Secret介绍及演示
Secret介绍 Secret存在的意义 Secret解决了密码.token.密钥等敏感数据的配置问题,而不需要把这些敏感数据暴露到镜像或者Pod Spec中,可以以Volume或者环境变量的方式使用 ...
- 阿里云短信服务验证码封装类 - PHP
本文记录在ThinkPHP6.0中使用阿里云短信验证码,该封装类不仅仅局限于TP,拿来即用 使用该类之前必须引入 flc/dysms 扩展,该封装类就是基于这个扩展写的 composer requir ...
- js中页面加载完成后执行的几种方法及执行顺序
在js和jquery使用中,经常使用到页面加载完成后执行某一方法.通过整理,大概是五种方式(其中有的只是书写方式不一样). 1:使用jQuery的$(function){}; 2:使用jquery的$ ...
- C#开发PACS医学影像处理系统(九):序列控件与拖拽
1.先看结构: 创建WPF用户控件:YourTab 创建WPF用户控件:YourItem 创建选项卡时循环添加item,并设置序列缩略图到控件和异步下载的进度条, 1个病人1个或多个Study检查,1 ...