ES6之Spread Operater拷贝对象
译者按: 对象拷贝和合并使用展开运算符(Spread Operator)很方便!
原文: Master Javascript’s New, Cutting-Edge Object Spread Operator
译者: Fundebug
为了保证可读性,本文采用意译而非直译。另外,本文版权归原作者所有,翻译仅用于学习。
在Node v8.0.0中引入了对象展开运算符(object spread operator)(注:需要配合harmony标签使用),在此我用一篇博客来深入介绍一下。前端使用该语法需要引入babel 插件。
展开运算符(Spread Operator)
展开运算符将所有可枚举的属性从一个对象展开到另一个对象去。我们来举一个例子:
const obj1 = { c: 3, d: 4 };
const obj2 = { a: 1, b: 2, ...obj1 };
console.log(obj2); // -> { a: 1, b: 2, c: 3, d: 4 }
|
obj1
的所有属性被展开到obj2
中去。
一个很好的使用场景就是深度拷贝一个对象:
const obj = { a: 123, b: 456 };
const objCopy = { ...obj };
console.log(objCopy); // -> { a: 123, b: 456 }
|
另一个使用场景是合并多个对象:
const obj1 = { a: 111, b: 222 };
const obj2 = { c: 333, d: 444 };
const merged = { ...obj1, ...obj2 };
console.log(merged); // -> { a: 111, b: 222, c: 333, d: 444 }
|
注意: 如果属性值是一个对象,那么只会生成一个指向该对象的引用,而不会深度拷贝。也就是说,展开运算符不会递归地深度拷贝所有属性。并且,只有可枚举属性会被拷贝,原型链不会被拷贝。
属性冲突
当两个对象中有相同的属性名称的时候,对象的顺序其关键作用。后面对象的值被赋值给新建的对象。
const obj1 = { a: 'abc', b: 'def' };
const obj2 = { b: 123, c: 456, ...obj1};
console.log(obj2); // -> { a: 'abc', b: 'def', c: 456 }
|
如果我们先展开obj1
:
const obj1 = { a: 'abc', b: 'def' };
const obj2 = { ...obj1, b: 123, c: 456 };
console.log(obj2); // -> { a: 'abc', b: 123, c: 456 }
|
对象默认值设置
对象属性值重写使对象默认赋值变得简单。比如我们想要制作一款应用需要用户输入基本信息,如果用户没有填写某些信息,我们会将默认值放置到那些属性上。
const enteredInfo = {
name: 'John Doe',
phoneNumber: '123-456-7890'
};
const defaultInfo = {
name: 'N/A',
address: null,
phoneNumber: null,
email: null
};
const completeUserInfo = { ...defaultInfo, ...enteredInfo };
|
剩余操作符(Rest Operator)
既然讲解了对象展开运算符,那么也讲一讲剩余操作符。为了理解剩余操作符, 我们需要首先理解 ES6的对象解构。
const obj1 = {
a: 'abc',
b: 'def',
c: 'ghi',
d: 'jkl'
};
const { a, b } = obj1;
console.log(a, b); // -> 'abc', 'def'
|
通过对象解构,我们获取了obj1
对象中的属性a
和b
。
现在,我们来使用剩余操作符。
const obj1 = {
a: 'abc',
b: 'def',
c: 'ghi',
d: 'jkl'
};
const { a, b, ...remainingProperties } = obj1;
console.log(a, b); // -> 'abc', 'def'
console.log(remainingProperties); // -> { c: 'ghi', d: 'jkl' }
|
obj1
中余下的属性值被打包起来构造一个新的对象赋值给了remainingProperties
。
关于Fundebug
Fundebug专注于JavaScript、微信小程序、微信小游戏、支付宝小程序、React Native、Node.js和Java实时BUG监控。 自从2016年双十一正式上线,Fundebug累计处理了7亿+错误事件,得到了Google、360、金山软件、百姓网等众多知名用户的认可。欢迎免费试用! ![](https://static.fundebug.cn/wechat_slogan.png)
版权声明:
转载时请注明作者Fundebug以及本文地址:
https://blog.fundebug.com/2017/07/19/master_object_spread_operator/
ES6之Spread Operater拷贝对象的更多相关文章
- Python 拷贝对象(深拷贝deepcopy与浅拷贝copy)
1. copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象. 2. copy.deepcopy 深拷贝 拷贝对象及其子对象 一个很好的例子: # -*-coding:utf-8 -*- ...
- 夺命雷公狗—angularjs—23—copy拷贝对象
copy这在angularjs中是一个拷贝对象的方法: <!DOCTYPE html> <html lang="en" ng-app="myapp&qu ...
- 使用copy来拷贝对象
拷贝对象 您通过将 copy 消息发送给对象,以制作对象的副本. NSArray *myArray = [yourArray copy]; 要拷贝,接收对象的类必须遵守 NSCopying 协议.如果 ...
- C++拷贝对象
简介 对象的创建中,常常有这样的需求,就是把对象复制一份. 而复制有三种方法: 1.通过初始化来复制 例如:Object o1(10); Object o2=o1; 2.通过赋值来复制 例如:Obje ...
- Java 使用反射拷贝对象一般字段值
在<Java解惑>上面看到第八十三例--诵读困难者,要求使用非反射实现单例对象的拷贝.查阅了部分资料,先实现通过反射拷贝对象. 1. 编写需要被拷贝的对象Person package co ...
- 读书笔记 effective c++ Item 12 拷贝对象的所有部分
1.默认构造函数介绍 在设计良好的面向对象系统中,会将对象的内部进行封装,只有两个函数可以拷贝对象:这两个函数分别叫做拷贝构造函数和拷贝赋值运算符.我们把这两个函数统一叫做拷贝函数.从Item5中,我 ...
- ES6之6种遍历对象属性的方法
ES6之6种遍历对象属性的方法 for ... in 循环遍历对象自身的和继承的可枚举属性(不含Symbol属性). Obejct.keys(obj),返回一个数组,包括对象自身的(不含继承的)所有可 ...
- python中拷贝对象的区别
一.赋值.引用 在python中赋值语句总是建立对象的引用值,而不是复制对象.因此,python变量更像是指针,而不是数据存储区域 这点和大多数语音类似吧,比如C++.Java等 1.先看个例子: v ...
- c# 表达式目录树拷贝对象(根据对象类型动态生成表达式目录树)
表达式目录树,在C#中用Expression标识,这里就不介绍表达式目录树是什么了,有兴趣可以自行百度搜索,网上资料还是很多的. 这里主要分享的是如何动态构建表达式目录树. 构建表达式目录树的代码挺简 ...
随机推荐
- 【高速接口-RapidIO】3、RapidIO串行物理层的包传输过程
一.引言 前几篇文章已经谈到RapidIO的协议,串行物理层与控制符号. RapidIO协议包括读事务(NREAD),写事务(NWRITE),流写事务(SWRITE),有响应的写事务(NWRITE_R ...
- 【SP26073】DIVCNT1 - Counting Divisors 题解
题目描述 定义 \(d(n)\) 为 \(n\) 的正因数的个数,比如 \(d(2) = 2, d(6) = 4\). 令 $ S_1(n) = \sum_{i=1}^n d(i) $ 给定 \(n\ ...
- Python编程练习:使用 turtle 库完成六边形的绘制
绘制效果: 源代码: # 六边形 import turtle turtle.setup(650, 350, 200, 200) turtle.penup() turtle.pendown() turt ...
- 从Java到JVM到OS线程睡眠
Java 中有时需要将线程进入睡眠状态,这时一般我们就会通过 Thread.sleep 使线程进入睡眠状态,接下去就看看执行该语句在 JVM 中做了什么. 简单例子 以下是一个简单的例子,使主线程睡眠 ...
- Javascript高级编程学习笔记(15)—— 引用类型(4)RegExp类型
JS中处理字符串最常用的应该就是正则了 同样正则(RegExp)类型也是JS中引用类型的一种 ECMAScript通过 RegExp类型 来支持正则表达式 创建正则 var expression = ...
- ADB驱动
Windows 7 64位下使用ADB驱动 什么是ADB? adb的全称为Android Debug Bridge,就是起到调试桥的作用.通过adb我们可以在Eclipse中方面通过DDMS来调试An ...
- Metasploit Framework(7)客户端渗透(下)
文章的格式也许不是很好看,也没有什么合理的顺序 完全是想到什么写一些什么,但各个方面都涵盖到了 能耐下心看的朋友欢迎一起学习,大牛和杠精们请绕道 应用场景: Kali机器IP:192.168.163. ...
- Python的串口通信(pyserial)
串口通信是指外设和计算机间,通过数据信号线 .地线.控制线等,按位进行传输数据的一种通讯方式.这种通信方式使用的数据线少,在远距离通信中可以节约通信成本,但其传输速度比并行传输低.串口是计算机上一种非 ...
- .NET图平台下的图像处理工具---强大的Emgucv
图像一直与时代相伴,图形化的应用软件也重不可缺.对于MFC.Delphi.Lazarus.Qt大家可能已经耳熟能详.对于很多图像处理的开源库,很多都是用C\C++写的,而.Net下的开源库以前很少了解 ...
- Windows2008/2012/2016多用户同时远程连接终端服务授权
win2016多用户登录: 添加角色“远程桌面服务”,子角色“远程桌面会话主机”和“远程桌面授权”,重启 远程桌面授权,激活服务器,企业协议,协议号6565792,授权模式“每用户” 本地策略管理器g ...