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入门之基本函数详解
Oct 21 Javascript
js实现的切换面板实例代码
Jun 17 Javascript
avascript中的自执行匿名函数应用示例
Sep 15 Javascript
js点击文本框弹出可选择的checkbox复选框
Feb 03 Javascript
JavaScript实现的微信二维码图片生成器的示例
Oct 26 Javascript
jQuery中 $ 符号的冲突问题及解决方案
Nov 04 Javascript
简单实现Bootstrap标签页
Aug 09 Javascript
深入理解vue.js中$watch的oldvalue与newValue
Aug 07 Javascript
如何优雅的在一台vps(云主机)上面部署vue+mongodb+express项目
Jan 20 Javascript
小程序多图列表实现性能优化的方法步骤
May 28 Javascript
浅谈layer的Icon样式以及一些常用的layer窗口使用方法
Sep 11 Javascript
JS函数参数的传递与同名参数实例分析
Mar 16 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获取地址栏信息的代码
2008/10/08 PHP
php函数指定默认值方法的小例子
2013/12/04 PHP
php实现压缩合并js的方法【附demo源码下载】
2016/09/22 PHP
JavaScript 直接操作本地文件的实现代码
2009/12/01 Javascript
qTip 基于JQuery的Tooltip插件[兼容性好]
2010/09/01 Javascript
汉化英文版的Dreamweaver CS5并自动提示jquery
2010/11/25 Javascript
js模拟点击事件实现代码
2012/11/06 Javascript
javascript实现tabs选项卡切换效果(自写原生js)
2013/03/19 Javascript
JSON+JavaScript处理JSON的简单例子
2013/03/20 Javascript
JavaScript中split() 使用方法汇总
2015/04/17 Javascript
详解JavaScript的另类写法
2016/04/11 Javascript
javascript防篡改对象实例详解
2017/04/10 Javascript
深入学习nodejs中的async模块的使用方法
2017/07/12 NodeJs
详解axios 全攻略之基本介绍与使用(GET 与 POST)
2017/09/15 Javascript
Vue实现数字输入框中分割手机号码的示例
2017/10/10 Javascript
基于Vue 2.0 监听文本框内容变化及ref的使用说明介绍
2018/08/24 Javascript
微信小程序ibeacon三点定位详解
2018/10/31 Javascript
Bootstrap 实现表格样式、表单布局的实例代码
2018/12/09 Javascript
jQuery实现表格的增、删、改操作示例
2019/01/27 jQuery
在vue中获取微信支付code及code被占用问题的解决方法
2019/04/16 Javascript
Bootstarp在pycharm中的安装及简单的使用方法
2019/04/19 Javascript
Vue+penlayers实现多边形绘制及展示
2020/12/24 Vue.js
python 布尔操作实现代码
2013/03/23 Python
python实现根据月份和日期得到星座的方法
2015/03/27 Python
centos6.4下python3.6.1安装教程
2017/07/21 Python
神经网络(BP)算法Python实现及应用
2018/04/16 Python
Python利用ORM控制MongoDB(MongoEngine)的步骤全纪录
2018/09/13 Python
Python使用pyautocad+openpyxl处理cad文件示例
2019/07/11 Python
python 实现矩阵填充0的例子
2019/11/29 Python
如何基于Django实现上下文章跳转
2020/09/16 Python
详解如何在pyqt中通过OpenCV实现对窗口的透视变换
2020/09/20 Python
Restful_framework视图组件代码实例解析
2020/11/17 Python
喜诗官方在线巧克力店:See’s Candies
2017/01/01 全球购物
美国高档百货Nordstrom的折扣店:Nordstrom Rack
2017/11/13 全球购物
2019初中学生入团申请书
2019/06/27 职场文书
在Java中Collection的一些常用方法总结
2021/06/13 Java/Android