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 相关文章推荐
Mootools 1.2教程 Fx.Tween的使用
Sep 15 Javascript
javascript打印html内容功能的方法示例
Nov 28 Javascript
JavaScript中的公有、私有、特权和静态成员用法分析
Nov 20 Javascript
js实现select跳转菜单新窗口效果代码分享(超简单)
Aug 21 Javascript
js中获取 table节点各tr及td的内容简单实例
Oct 14 Javascript
node学习记录之搭建web服务器教程
Feb 16 Javascript
深入理解Node.js中的进程管理
Mar 13 Javascript
JavaScript数据类型的存储方法详解
Aug 25 Javascript
bootstrap datetimepicker控件位置异常的解决方法
Nov 23 Javascript
使用vue-cli脚手架工具搭建vue-webpack项目
Jan 14 Javascript
Vue 组件的挂载与父子组件的传值实例
Sep 02 Javascript
如何在现代JavaScript中编写异步任务
Jan 31 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
JAVA/JSP学习系列之四
2006/10/09 PHP
使用gd库实现php服务端图片裁剪和生成缩略图功能分享
2013/12/25 PHP
php递归使用示例(php递归函数)
2014/02/14 PHP
php数组键名技巧小结
2015/02/17 PHP
php获取文件名后缀常用方法小结
2015/02/24 PHP
PHP echo()函数讲解
2019/02/15 PHP
laravel与thinkphp之间的区别与优缺点
2021/03/02 PHP
jQuery javaScript捕获回车事件(示例代码)
2013/11/07 Javascript
nodejs获取本机内网和外网ip地址的实现代码
2014/06/01 NodeJs
Bootstrap弹出带合法性检查的登录框实例代码【推荐】
2016/06/23 Javascript
js css+html实现简单的日历
2016/07/14 Javascript
Javascript之面向对象--接口
2016/12/02 Javascript
angularJS 发起$http.post和$http.get请求的实现方法
2017/05/18 Javascript
JavaScript事件方法(实例讲解)
2017/06/27 Javascript
ztree简介_动力节点Java学院整理
2017/07/19 Javascript
微信小程序使用input组件实现密码框功能【附源码下载】
2017/12/11 Javascript
Angular如何在应用初始化时运行代码详解
2018/06/11 Javascript
JS实现点击拉拽轮播图pc端移动端适配
2018/09/05 Javascript
koa-router源码学习小结
2018/09/07 Javascript
详解vantUI框架在vue项目中的应用踩坑
2018/12/06 Javascript
详解React项目如何修改打包地址(编译输出文件地址)
2019/03/21 Javascript
Nodejs监听日志文件的变化的过程解析
2019/08/04 NodeJs
终端命令查看TensorFlow版本号及路径的方法
2018/06/13 Python
python实现五子棋小游戏
2020/03/25 Python
Python爬虫学习之获取指定网页源码
2019/07/30 Python
Python argparse模块应用实例解析
2019/11/15 Python
python实现矩阵和array数组之间的转换
2019/11/29 Python
购买中国最好的电子产品:Geekbuying
2018/03/13 全球购物
应届毕业生个人自荐信范文
2013/11/30 职场文书
毕业生自荐书
2013/12/18 职场文书
党员批评与自我批评总结
2014/10/15 职场文书
2014年卫生监督工作总结
2014/12/09 职场文书
2015年敬老月活动总结
2015/03/27 职场文书
全国法制宣传日活动总结
2015/05/05 职场文书
2015年前台文员工作总结
2015/05/18 职场文书
民事诉讼代理词
2015/05/25 职场文书