JavaScript展开操作符(Spread operator)详解


Posted in Javascript onJuly 20, 2019

你可以通过展开操作符(Spread operator)...扩展一个数组对象和字符串。展开运算符(spread)是三个点(…),可以将可迭代对象转为用逗号分隔的参数序列。如同rest参数的逆运算。

用于数组

以数组为例,首先创建一个数组,

const a = [1, 2, 3],
     b = [4,5,6];

你可以轻松赋值一个数组:

const c = [...a] // [1,2,3]

你还可以轻松拼接两个数组:

const d = [...a,...b] // [1,2,3,4,5,6]

也可以如下拼接

const d = [...a,4, 5, 6] // [1,2,3,4,5,6]

如果要把一个数组b的元素全部插入到数组a的后面(不生成新数组),可以这样操作:

const a = [1,2,3];
a.push(...b);

如果要把一个数组b的元素全部插入到数组a的前面(不生成新数组),可以这样操作:

const a = [1,2,3];
a. unshift(...b);

类数组对象变成数组

可以通过展开运算符把类数组对象变成真正的数组:

var list=document.getElementsByTagName('a');
var arr=[..list];

用于对象

展开操作符同样可以用于对象。可以通过以下方式clone一个对象:

const newObj = { ...oldObj }

注意: 如果属性值是一个对象,那么只会生成一个指向该对象的引用,而不会深度拷贝。也就是说,展开运算符不会递归地深度拷贝所有属性。并且,只有可枚举属性会被拷贝,原型链不会被拷贝。

还可以用于merge两个对象。

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 others = {third: 3, fourth: 4, fifth: 5}
const items = { first:1, second:1, ...others }
items //{ first: 1, second: 2, third: 3, fourth: 4, fifth: 5 }

如果merge的多个对象有相同属性,则后面的对象的会覆盖前面对象的属性,比如

const obj1 = { a: 111, b: 222 };
const obj2 = { b: 333, d: 444 };
const merged = { ...obj1, ...obj2 };
console.log(merged); // -> { a: 111, b: 333, d: 444 }

const obj1 = {a:111,b:222}
const merged = {a:222,...obj1}; 
console.log(merged); // -> { a: 111, b: 333 }

const obj1 = {a:111,b:222}
const merged = {...obj1,a:222}; 
console.log(merged); // -> { a: 222, b: 333 }

用于字符串

通过展开操作符,可以把一个字符串分解成一个字符数组,相当于

const hey = 'hey'
const arrayized = [...hey] // ['h', 'e', 'y']

以上代码相当于:

const hey = 'hey'
const arrayized = hey.split('') // ['h', 'e', 'y']

用于函数传参

通过展开操作符,可以通过数组给函数传参:

const f = (foo, bar) => {}
const a = [1, 2]
f(...a)

const numbers = [1, 2, 3, 4, 5]
const sum = (a, b, c, d, e) => a + b + c + d + e
const sum = sum(...numbers)

用于具有 Iterator 接口的对象

具有 Iterator 接口的对象Map 和 Set 结构,Generator 函数,可以使用展开操作符,比如:

var s = new Set();
s.add(1);
s.add(2);
var arr = [...s]// [1,2]


function * gen() {
  yield 1;
  yield 2;
  yield 3;
}

var arr = [...gen()] // 1,2,3

如果是map,会把每个key 和 value 转成一个数组:

var m = new Map();
m.set(1,1)
m.set(2,2)
var arr = [...m] // [[1,1],[2,2]]

注意以下代码会报错,因为obj不是一个Iterator对象:

var obj = {'key1': 'value1'};
var array = [...obj]; // TypeError: obj is not iterable

以上就是全部相关知识点,感谢大家的阅读和对三水点靠木的支持。

Javascript 相关文章推荐
将函数的实际参数转换成数组的方法
Jan 25 Javascript
js判断页面中是否有指定控件的简单实例
Mar 04 Javascript
jQuery选择器源码解读(六):Sizzle选择器匹配逻辑分析
Mar 31 Javascript
举例详解Python中smtplib模块处理电子邮件的使用
Jun 24 Javascript
超漂亮的jQuery图片轮播特效
Nov 24 Javascript
学习vue.js中class与style绑定
Dec 03 Javascript
js 博客内容进度插件详解
Feb 19 Javascript
Angularjs之ngModel中的值验证绑定方法
Sep 13 Javascript
JS去除字符串最后的逗号实例分析【四种方法】
Jun 20 Javascript
Servlet返回的数据js解析2种方法
Dec 12 Javascript
vue-quill-editor的使用及个性化定制操作
Aug 04 Javascript
js实现3D粒子酷炫动态旋转特效
Sep 13 Javascript
JavaScript剩余操作符Rest Operator详解
Jul 20 #Javascript
微信小程序点击图片实现长按预览、保存、识别带参数二维码、转发等功能
Jul 20 #Javascript
基于vue 实现表单中password输入的显示与隐藏功能
Jul 19 #Javascript
el-input 标签中密码的显示和隐藏功能的实例代码
Jul 19 #Javascript
Android 自定义view仿微信相机单击拍照长按录视频按钮
Jul 19 #Javascript
使用element-ui的el-menu导航选中后刷新页面保持当前选中状态
Jul 19 #Javascript
Vue实战教程之仿肯德基宅急送App
Jul 19 #Javascript
You might like
php二分法在IP地址查询中的应用
2008/08/12 PHP
PHP 登录完成后如何跳转上一访问页面
2014/01/14 PHP
PHP DB 数据库连接类定义与用法示例
2019/03/11 PHP
针对PHP开发安全问题的相关总结
2019/03/22 PHP
判断多个元素(RADIO,CHECKBOX等)是否被选择的原理说明
2009/02/18 Javascript
使用js实现一个可编辑的select下拉列表
2014/02/20 Javascript
Javascript基础教程之argument 详解
2015/01/18 Javascript
jQuery中extend函数的实现原理详解
2015/02/03 Javascript
Jquery中find与each方法用法实例
2015/02/04 Javascript
PHP+MySQL+jQuery随意拖动层并即时保存拖动位置实例讲解
2015/10/09 Javascript
使用postMesssage()实现iframe跨域页面间的信息传递
2016/03/29 Javascript
JavaScript判断是否是微信浏览器
2016/06/13 Javascript
vue.js实例todoList项目
2017/07/07 Javascript
使用Vue开发动态刷新Echarts组件的教程详解
2018/03/22 Javascript
JavaScript 点击触发复制功能实例详解
2018/11/02 Javascript
es6 symbol的实现方法示例
2019/04/02 Javascript
Bootstrap 时间日历插件bootstrap-datetimepicker配置与应用小结
2019/05/28 Javascript
[13:21]DOTA2国际邀请赛采访专栏:RSnake战队国士无双,Fnatic.Fly
2013/08/06 DOTA
python根据unicode判断语言类型实例代码
2018/01/17 Python
python实现五子棋小程序
2019/06/18 Python
Python GUI库PyQt5图形和特效样式QSS介绍
2020/02/25 Python
Python 3.8 新功能来一波(大部分人都不知道)
2020/03/11 Python
Python 实现简单的客户端认证
2020/07/29 Python
Python爬虫代理池搭建的方法步骤
2020/09/28 Python
python 使用csv模块读写csv格式文件的示例
2020/12/02 Python
css3中新增的样式使用示例附效果图
2014/08/19 HTML / CSS
Aerosoles爱柔仕官网:美国舒软女鞋品牌
2017/07/17 全球购物
财会自我鉴定范文
2013/12/27 职场文书
合作意向书模板
2014/03/31 职场文书
走群众路线学习笔记
2014/11/06 职场文书
2014年银行信贷员工作总结
2014/12/08 职场文书
2015年个人实习工作总结
2014/12/12 职场文书
村党组织公开承诺书
2015/04/30 职场文书
老人节主持词
2015/07/04 职场文书
PyTorch 如何检查模型梯度是否可导
2021/06/05 Python
Go语言grpc和protobuf
2022/04/13 Golang