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语句中的CDATA标签的意义
May 09 Javascript
动态的创建一个元素createElement及删除一个元素
Jan 24 Javascript
jQuery实现3D文字特效的方法
Mar 10 Javascript
jquery.tableSort.js表格排序插件使用方法详解
Aug 12 Javascript
AngularJS 的$timeout服务示例代码
Sep 21 Javascript
Vue 2.0学习笔记之Vue中的computed属性
Oct 16 Javascript
从vue基础开始创建一个简单的增删改查的实例代码(推荐)
Feb 11 Javascript
H5+C3+JS实现五子棋游戏(AI篇)
May 28 Javascript
element vue validate验证名称重复 输入框与后台重复验证 特殊字符 字符长度 及注意事项小结【实例代码】
Nov 20 Javascript
写一个Vue Popup组件
Feb 25 Javascript
ant design vue datepicker日期选择器中文化操作
Oct 28 Javascript
JavaScript 与 TypeScript之间的联系
Nov 27 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
Window下PHP三种运行方式图文详解
2013/06/11 PHP
解析PHP计算页面执行时间的实现代码
2013/06/18 PHP
PHP获取ip对应地区和使用网络类型的方法
2015/03/11 PHP
Javascript中使用A标签获取当前目录的绝对路径方法
2015/03/02 Javascript
浅谈JavaScript中的对象及Promise对象的实现
2015/11/15 Javascript
详解Bootstrap的iCheck插件checkbox和radio
2016/08/24 Javascript
微信小程序之picker日期和时间选择器
2017/02/09 Javascript
jQuery实现的点击按钮改变样式功能示例
2018/07/21 jQuery
vue滚动tab跟随切换效果
2020/06/29 Javascript
原生JavaScript实现刮刮乐
2020/09/29 Javascript
ant-design-vue中tree增删改的操作方法
2020/11/03 Javascript
python共享引用(多个变量引用)示例代码
2013/12/04 Python
用Python实现一个简单的能够上传下载的HTTP服务器
2015/05/05 Python
深入理解python函数递归和生成器
2016/06/06 Python
Python tkinter模块中类继承的三种方式分析
2017/08/08 Python
浅谈python爬虫使用Selenium模拟浏览器行为
2018/02/23 Python
Python实现的FTP通信客户端与服务器端功能示例
2018/03/28 Python
使用Python读取安卓手机的屏幕分辨率方法
2018/03/31 Python
Python3实现的判断回文链表算法示例
2019/03/08 Python
Python之虚拟环境virtualenv,pipreqs生成项目依赖第三方包的方法
2019/07/23 Python
Python下利用BeautifulSoup解析HTML的实现
2020/01/17 Python
python解决OpenCV在读取显示图片的时候闪退的问题
2021/02/23 Python
有关HTML5中背景音乐的自动播放功能
2017/10/16 HTML / CSS
amazeui页面分析之登录页面的示例代码
2020/08/25 HTML / CSS
Hanro官网:奢华男士和女士内衣、睡衣和家居服
2018/10/25 全球购物
智能钱包:Ekster
2019/11/21 全球购物
前台领班岗位职责
2013/12/04 职场文书
工商管理专业职业生涯规划
2014/01/01 职场文书
怎样写演讲稿
2014/01/04 职场文书
办加油卡单位介绍信
2014/01/09 职场文书
爱情保证书范文
2014/02/01 职场文书
优秀家长事迹材料
2014/05/17 职场文书
诉前财产保全担保书
2014/05/20 职场文书
农村优秀教师事迹材料
2014/08/27 职场文书
导游词之丽江普济寺
2019/10/22 职场文书
撤回我也能看到!教你用Python制作微信防撤回脚本
2021/06/11 Python