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 相关文章推荐
理解JavaScript中的对象 推荐
Jan 09 Javascript
JavaScript实现维吉尼亚(Vigenere)密码算法实例
Nov 22 Javascript
详解js中的apply与call的用法
Jul 30 Javascript
js从数组中删除指定值(不是指定位置)的元素实现代码
Sep 13 Javascript
js return返回多个值,通过对象的属性访问方法
Feb 21 Javascript
JS常见创建类的方法小结【工厂方式,构造器方式,原型方式,联合方式等】
Apr 01 Javascript
Vue2.0 给Tab标签页和页面切换过渡添加样式的方法
Mar 13 Javascript
JS简单生成由字母数字组合随机字符串示例
May 25 Javascript
Electron-vue脚手架改造vue项目的方法
Oct 22 Javascript
Vue实现商品分类菜单数量提示功能
Jul 26 Javascript
使用webpack搭建pixi.js开发环境
Feb 12 Javascript
如何用JS实现网页瀑布流布局
Apr 24 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防CC攻击实现代码
2011/12/29 PHP
几个有用的php字符串过滤,转换函数代码
2012/05/01 PHP
9个实用的PHP代码片段分享
2015/01/22 PHP
php实现TCP端口检测的方法
2015/04/01 PHP
PHP面试题之文件目录操作
2015/10/15 PHP
php上传图片并压缩的实现方法
2015/12/22 PHP
PHP水印类,支持添加图片、文字、填充颜色区域的实现
2017/02/04 PHP
Yii2下点击验证码的切换实例代码
2017/03/14 PHP
js不是基础的基础
2006/12/24 Javascript
JavaScript脚本性能的优化方法
2007/02/02 Javascript
让AJAX不依赖后端接口实现方案
2012/12/03 Javascript
js判断字符长度以及中英文数字等
2013/12/31 Javascript
IE浏览器不支持getElementsByClassName的解决方法
2014/08/27 Javascript
Easyui 之 Treegrid 笔记
2016/04/29 Javascript
js放大镜放大购物图片效果
2017/01/18 Javascript
详解Javascript中DOM的范围
2017/02/13 Javascript
JavaScript定义函数_动力节点Java学院整理
2017/06/27 Javascript
微信小程序progress组件使用详解
2018/01/31 Javascript
web前端页面生成exe可执行文件的方法
2018/02/08 Javascript
解决Layui选择全部,换页checkbox复选框重新勾选的问题方法
2018/08/14 Javascript
vue中利用iscroll.js解决pc端滚动问题
2020/02/15 Javascript
Vue中函数防抖节流的理解及应用实现
2020/04/24 Javascript
JSON 入门教程基础篇 json入门学习笔记
2020/09/22 Javascript
浅谈js数组splice删除某个元素爬坑
2020/10/14 Javascript
JavaScript实现无限轮播效果
2020/11/19 Javascript
win7安装python生成随机数代码分享
2013/12/27 Python
python基础教程之获取本机ip数据包示例
2014/02/10 Python
Python中字典的基础知识归纳小结
2015/08/19 Python
使用PyCharm配合部署Python的Django框架的配置纪实
2015/11/19 Python
Python获取Redis所有Key以及内容的方法
2019/02/19 Python
Numpy数组array和矩阵matrix转换方法
2019/08/05 Python
Python装饰器用法与知识点小结
2020/03/09 Python
Python约瑟夫生者死者小游戏实例讲解
2021/01/04 Python
师范生自荐信
2013/10/27 职场文书
学校联谊协议书
2014/09/16 职场文书
经典励志格言:每日一句,让你每天充满能量
2019/08/16 职场文书