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 相关文章推荐
jquery下利用jsonp跨域访问实现方法
Jul 29 Javascript
SOSO地图API使用(一)在地图上画圆实现思路与代码
Jan 15 Javascript
javascript定义变量时有var和没有var的区别探讨
Jul 21 Javascript
js构造函数、索引数组和属性的实现方式和使用
Nov 16 Javascript
Vue插件写、用详解(附demo)
Mar 20 Javascript
兼容浏览器的js事件绑定函数(详解)
May 09 Javascript
详解webpack介绍&安装&常用命令
Jun 29 Javascript
Angularjs上传图片实例详解
Aug 06 Javascript
JavaScript中一些特殊的字符运算
Aug 17 Javascript
Vue组件之自定义事件的功能图解
Feb 01 Javascript
JS的Ajax与后端交互数据的实例
Aug 08 Javascript
谈谈为什么你的 JavaScript 代码如此冗长
Jan 30 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学习之输出字符串(echo,print,printf,print_r和var_dump)
2011/04/17 PHP
php格式化日期和时间格式化示例分享
2014/02/24 PHP
php+mysql不用递归实现的无限级分类实例(非递归)
2014/07/08 PHP
php检查函数必传参数是否存在的实例详解
2017/08/28 PHP
js jq 单击和双击区分示例介绍
2013/11/05 Javascript
js图片自动轮播代码分享(js图片轮播)
2014/05/06 Javascript
Extjs Label的 fieldLabel和html属性值对齐的方法
2014/06/15 Javascript
Javascript中的默认参数详解
2014/10/22 Javascript
JS正则表达式修饰符global(/g)用法分析
2016/12/27 Javascript
Vue实现双向数据绑定
2017/05/03 Javascript
JS给按钮添加跳转功能类似a标签
2017/05/30 Javascript
10个最优秀的Node.js MVC框架
2017/08/24 Javascript
vue-cli webpack模板项目搭建及打包时路径问题的解决方法
2018/02/26 Javascript
详解VUE-地区选择器(V-Distpicker)组件使用心得
2018/05/07 Javascript
JavaScript中click和onclick本质区别与用法分析
2018/06/07 Javascript
element-ui中select组件绑定值改变,触发change事件方法
2018/08/24 Javascript
微信小程序ibeacon三点定位详解
2018/10/31 Javascript
vue element ui validate 主动触发错误提示操作
2020/09/21 Javascript
[01:38]完美世界DOTA2联赛PWL S3 集锦第四期
2020/12/21 DOTA
videocapture库制作python视频高速传输程序
2013/12/23 Python
Python 专题五 列表基础知识(二维list排序、获取下标和处理txt文本实例)
2017/03/20 Python
Python实战小程序利用matplotlib模块画图代码分享
2017/12/09 Python
pycharm远程linux开发和调试代码的方法
2018/07/17 Python
Python基于datetime或time模块分别获取当前时间戳的方法实例
2019/02/19 Python
python搜索包的路径的实现方法
2019/07/19 Python
Python实现搜索算法的实例代码
2020/01/02 Python
windows、linux下打包Python3程序详细方法
2020/03/17 Python
基于opencv的selenium滑动验证码的实现
2020/07/24 Python
北京大学自荐信范文
2014/01/28 职场文书
办公设备采购方案
2014/03/16 职场文书
餐饮商业计划书范文
2014/04/29 职场文书
酒店辞职书范文
2015/02/26 职场文书
运动会1000米加油稿
2015/07/21 职场文书
2015年小学实验室工作总结
2015/07/28 职场文书
关于python中模块和重载的问题
2021/11/02 Python
python运行脚本文件的三种方法实例
2022/06/25 Python