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 ui 1.7 ui.tabs 动态添加与关闭(按钮关闭+双击关闭)
Apr 01 Javascript
js动态创建标签示例代码
Jun 09 Javascript
firefox浏览器用jquery.uploadify插件上传时报HTTP 302错误
Mar 01 Javascript
Jquery中request和request.form和request.querystring的区别
Nov 26 Javascript
js停止冒泡和阻止浏览器默认行为的简单方法
May 15 Javascript
canvas实现探照灯效果
Feb 07 Javascript
js获取元素的偏移量offset简单方法(必看)
Jul 05 Javascript
微信小程序之多列表的显示和隐藏功能【附源码】
Aug 06 Javascript
VUE 全局变量的几种实现方式
Aug 22 Javascript
javascript触发模拟鼠标点击事件
Jun 26 Javascript
浅入深出Vue之自动化路由
Aug 06 Javascript
vue实现购物车加减
May 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 静态变量与自定义常量的使用方法
2010/01/26 PHP
学习php设计模式 php实现观察者模式(Observer)
2015/12/09 PHP
php metaphone()函数及php localeconv() 函数实例解析
2016/05/15 PHP
PHP正则判断一个变量是否为正整数的方法
2019/02/27 PHP
JQuery+CSS提示框实现思路及代码(纯手工打造)
2013/05/07 Javascript
Jquery获取元素的父容器对象示例代码
2014/02/10 Javascript
JavaScript中匿名、命名函数的性能测试
2014/09/04 Javascript
JS随机调用指定函数的方法
2015/07/01 Javascript
jquery简单实现带渐显效果的选项卡菜单代码
2015/09/01 Javascript
[原创]JS基于FileSaver.js插件实现文件保存功能示例
2016/12/08 Javascript
关于foreach循环中遇到的问题小结
2017/05/08 Javascript
详解React开发中使用require.ensure()按需加载ES6组件
2017/05/12 Javascript
在 React、Vue项目中使用SVG的方法
2018/02/09 Javascript
vue中实现移动端的scroll滚动方法
2018/03/03 Javascript
vue3.0 CLI - 2.5 - 了解组件的三维
2018/09/14 Javascript
JavaScript数据结构与算法之二叉树实现查找最小值、最大值、给定值算法示例
2019/03/01 Javascript
详解使用uni-app开发微信小程序之登录模块
2019/05/09 Javascript
微信小程序实现元素渐入渐出动画效果封装方法
2019/05/18 Javascript
浅谈Express.js解析Post数据类型的正确姿势
2019/05/30 Javascript
nuxt 页面路由配置,主页轮播组件开发操作
2020/11/05 Javascript
js实现简易点击切换显示或隐藏
2020/11/29 Javascript
MySQLdb ImportError: libmysqlclient.so.18解决方法
2014/08/21 Python
SQLite3中文编码 Python的实现
2017/01/11 Python
python3.6使用urllib完成下载的实例
2018/12/19 Python
对python中字典keys,values,items的使用详解
2019/02/03 Python
Spring Cloud Feign高级应用实例详解
2019/12/10 Python
python爬虫使用正则爬取网站的实现
2020/08/03 Python
python判断一个变量是否已经设置的方法
2020/08/13 Python
python实现KNN近邻算法
2020/12/30 Python
Infababy英国:婴儿推车、Travel System婴儿车和婴儿汽车座椅销售
2018/05/23 全球购物
2013年员工自我评价范文
2013/12/27 职场文书
《吃水不忘挖井人》教学反思
2014/04/15 职场文书
小学校长先进事迹材料
2014/05/13 职场文书
贷款收入证明范本
2015/06/12 职场文书
浅析Python实现DFA算法
2021/06/26 Python
win10此电脑打不开怎么办 win10双击此电脑无响应的解决办法
2022/07/23 数码科技