ES6之Spread Operater拷贝对象
来源:互联网 发布:mac 安装dmg到user 编辑:程序博客网 时间:2024/06/04 18:09
译者按: 对象拷贝和合并使用展开运算符(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以及本文地址:
https://blog.fundebug.com/2017/07/19/master_object_spread_operator/
- ES6之Spread Operater拷贝对象
- ES6之Promise对象
- ES6学习之promise对象
- ios 之对象 拷贝
- Python之拷贝对象
- ES6 展开运算符 Spread operator
- Python对象之深拷贝、浅拷贝
- 拷贝python对象之浅拷贝和深拷贝
- Python对象拷贝之浅拷贝与深拷贝
- ES6之路--对象的扩展
- 学习笔记:ES6之对象扩展
- ES6系列之---对象的扩展函数
- js对象之深浅拷贝
- ES6--对象
- ES6-对象
- ES6--对象
- ES6--对象
- 面向对象2之对象深拷贝与浅拷贝
- JSON和JSONP
- JAVA学习:异常中级
- CentOS安装gtk2.0
- RetroScope工具:Android设备内存取证
- 前端JS知识要点总结(6)
- ES6之Spread Operater拷贝对象
- CentOS7 设置redis重启配置文件
- 生产者消费者模型,C/C++实现(Linux)
- Android百度地图的使用
- 微信小程序---地图使用(定位/展示/周边信息展示/poi搜索)
- varnishi
- 表格可以横竖向滑动
- 笨方法学python(本文为阅读时从此书摘录的笔记) 第六天(留坑)
- java编程语言基础知识点(2)