JS中的扩展运算符(...)和剩余运算符(...)

文章目录

    • 一、概念
    • 二、扩展运算符
    • 三、剩余运算符
    • 四、总结
    • 五、参考资料


一、概念

在JS中,扩展运算符(spread)是三个点 (...) ,剩余运算符(rest)也是三个点 (...)

二、扩展运算符

(1)基本使用:扩展运算符的主要作用是将一个数组转为用逗号分隔的参数序列,它好比 rest 的逆运算

//传递数据代替多个字符串的形式
function  test(a,b,c){console.log(a); // 1console.log(b); // 2console.log(c); // 3
}var arr = [1, 2, 3];
test(...arr);//将一个数组插入到另一个数组中
var arr1 = [1,2,3];
var arr2 = [...arr1, 4, 5, 6];
console.log(arr2); // [1, 2, 3, 4, 5, 6]//字符串转数组
var str = 'hello';
var arr3 = [...str];
console.log(arr3); // ["h", "e", "l", "l", "o"]

(2)扩展运算符(…)会调用默认的 Iterator 接口。

// 例一
var str = 'hello';
[...str] //  ['h','e','l','l','o']// 例二
let arr = ['b', 'c'];
['a', ...arr, 'd']
// ['a', 'b', 'c', 'd']

上面代码的扩展运算符内部就调用 Iterator 接口。

实际上,这提供了一种简便机制,可以将任何部署了 Iterator 接口的数据结构,转为数组。也就是说,只要某个数据结构部署了 Iterator 接口,就可以对它使用扩展运算符,将其转为数组。

let arr = [...iterable];

有关对 Iterator 的介绍,请查看这篇文章 ES6中的Iterator(遍历器)和 for of 循环

(3)由于扩展运算符可以展开数组,所以可以用来替代函数的 apply 方法

// ES5 的写法
function f(x, y, z) {// ...
}
var args = [0, 1, 2];
f.apply(null, args);// ES6 的写法
function f(x, y, z) {// ...
}
let args = [0, 1, 2];
f(...args);

下面是扩展运算符取代 apply 方法的一个实际的例子,应用 Math.max 方法,简化求出一个数组最大元素的写法。

// ES5 的写法
Math.max.apply(null, [14, 3, 77])// ES6 的写法
Math.max(...[14, 3, 77])// 等同于
Math.max(14, 3, 77);


三、剩余运算符

把用逗号隔开的值序列组合成一个数组

//当函数参数个数不确定时,用 rest运算符
function f1(...args) {console.log(args); // [1,2,3]
}f1(1,2,3);//当函数参数个数不确定时的第二种情况
function f2(item, ...arr) {console.log(item); // 1console.log(arr);  // [2,3]
}
f2(1, 2, 3);//rest运算符配合 解构使用
let [a,...temp]=[1, 2, 4];
console.log(a);    // 1
console.log(temp); // [2,4]

四、总结

扩展运算符(spread)用三个点号表示,功能是把数组或类数组对象展开成一系列用逗号隔开的值。

剩余运算符(rest)也是三个点号,不过其功能与扩展运算符恰好相反,把逗号隔开的值序列组合成一个数组。

当三个点(…)在等号左边,或者放在形参上,为 rest 运算符

当三个在等号右边,或者放在实参上,是 spread运算符

或者说:放在被赋值一方是rest 运算符。放在赋值一方式 spread运算符。


五、参考资料

数组的扩展 - ECMAScript 6入门

ES6中扩展运算符(spread)和剩余运算符(rest)详解 - 简书


---------------------
作者:webchang
来源:CSDN
原文:https://blog.csdn.net/weixin_43974265/article/details/113030814
版权声明:本文为作者原创文章,转载请附上博文链接!
内容解析By:CSDN,CNBLOG博客文章一键转载插件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/283467.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SFB 项目经验-07-Skype for Business 话机 Polycom CX700

本系列博文:Lync 项目经验-01-共存迁移-Lync2013-TO-SFB 2015-规划01http://dynamic.blog.51cto.com/711418/1858520 Lync 项目经验-02-共存迁移-Lync2013-TO-SFB 2015-规划02http://dynamic.blog.51cto.com/711418/1859143 Lync 项目经验-03-共存迁移-Lync2013-TO…

亿方云CEO程远:转型第一式:链接企业人与数据

传统企业一直在探讨如何做好互联网转型,那么互联网核心是什么?转型目标是什么?亿方云CEO程远在此次峰会上发表了自己看法,他认为快、人、连接是互联网核心基因,转型第一步就在于企业、人与数据的充分链接。中国企业的互…

Linux下Gcc 的编译过程

在linux下开发难免会用到gcc编译。GCC(GNU Compiler Collection。GNU编译器套装),是由 GNU 开发的编程语言编译器。它是GNU编译器套装以GPL许可证所发行的自由软件,也是 GNU计划的关键部分。使用GCC编译程序时,编译过程能够被细分…

使用.NET简单实现一个Redis的高性能克隆版(七-完结)

译者注该原文是Ayende Rahien大佬业余自己在使用C# 和 .NET构建一个简单、高性能兼容Redis协议的数据库的经历。首先这个"Redis"是非常简单的实现,但是他在优化这个简单"Redis"路程很有趣,也能给我们在从事性能优化工作时带来一些启…

解决 Vue 里 Script 标签首层不缩进 - VS Code

问题: 在 vscode 使用 vue 的时候,发现 script 标签首层不缩进??? 下载扩展:prettier 解决方法一: 打开 setting.json文件 添加:"prettier.vueIndentScriptAndStyle": tru…

Android应用开发性能优化完全分析

1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾。不想写的原因是随便上网一搜一堆关于性能的建议,感觉大家你一总结、我一总结的都说到了很多优化注意事项,但是看过这些文章后大多数存在一个问题就是只给出啥啥啥不能用&am…

ZBLOG-ASP2.2如何给图片增加ALT标签说明文字?

2019独角兽企业重金招聘Python工程师标准>>> 一直以来,我们在建设网站的时候,都容易犯下一个大错误,那就是没有重视图片的文字说明,而大多数时候,技术方面并不能很好的识别图片的内容,这也是受限…

养成这个习惯,学习.NET可以少走很多弯路

随着时代的发展,很多曾经风靡一时的编程语言后来被新的开发语言取代、慢慢走向没落,如:Delphi、Perl、Adobe Flash、Ruby等,但 .NET 始终坚若磐石,它作为一款备受受欢迎的开发平台,到底有什么优势呢&#x…

[asp.net mvc 奇淫巧技] 04 - 你真的会用Action的模型绑定吗?

在QQ群或者一些程序的交流平台,经常会有人问:我怎么传一个数组在Action中接收、我传的数组为什么Action的model中接收不到、或者我在ajax的data中设置了一些数组,为什么后台还是接收不了、还有一些怎么传送一个复杂的对象或者Action怎么接收一…

拒绝“高冷”词汇!初学C#中的委托

拒绝“高冷”词汇!初学C#中的委托 有一天,你写了好多好多带“形参”的构造函数(就是“方法”,同义),而且需要向这些构造函数里传递同样的“实参”,然后你就憨憨地一个一个函数的调用并赋予同样的…

JAVA企业级应用TOMCAT实战视频课程

1. Tomcat简介Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun和其他一些公司及个人共同开发而成。Tomcat服务器是一个免费的开放源代码的Web应用服务器,属于轻量级应用服务器…

WPF 系列-01默认程序结构

WPF应用程序启动项创建一个WPF应用程序&#xff0c;系统为我们自动生成了App.xaml和一个普通的MainWindow.xaml窗体文件。App.xaml 和cs 文件文件如下&#xff1a;<Application x:Class"Example_01.App"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/…

纳税服务系统【角色与用户】

用户与角色之间的关系 我们在做用户模块的时候&#xff0c;漏掉了最后一个功能。在新增功能中是可以选择角色的。 用户与角色之间的关系也是多对多 一个用户对应多个角色一个角色可以被多个用户使用。现在呢&#xff0c;我们的用户表已经是写的了。我们最好就不要修改原有的用户…

flex-grow flex-shrink 解决最后一行个数不足无法对齐

正常情况下&#xff0c;每页大小15个&#xff0c;设置每行3列&#xff0c;刚好5行。 当外部容器宽度不足以放3列时&#xff0c;自动换行&#xff0c;但最后一行元素自动撑满 &#xff0c;会造成元素块大小不一致&#xff0c;不是想要的效果 原始代码示例&#xff1a; <ul …

POJ 1562深搜判断连体油田个数

http://poj.org/problem?id1562 大意&#xff1a;输入mp二维矩阵&#xff0c;规定‘’连体的包括对角线为一片油田&#xff0c;统计共有多少油田。深搜方向数组dir设置8个方向遇到继续搜索把当前位置赋值*避免重复遍历即可 #include <iostream> #include <cmath> …

C# 并行编程避坑指南之-Try Catch系列

自从.NET Framework 4.5(含4.5)提供了Task开启线程后&#xff0c;基本上Thread的使用频率就大幅度降低了&#xff0c;但是一些老项目&#xff0c;或者老程序还是习惯用Thread去做&#xff0c;如果一定要使用Thred&#xff0c;那我们就必须在代码中使用try、catch块去处理异常的…

系统配置vue.config.js(通用)和vue3中的vite.config.js的通用配置

vue配置大全 本人实例自用&#xff0c;不喜勿喷 vue.config.js的配置 module.exports {devServer: {host: ,hot: true,port: 8086,disableHostCheck: true,//新版的webpack-dev-server出于安全考虑&#xff0c;默认检查hostname&#xff0c;//如果hostname不是配置内的&#x…

.NET 6应用程序适配国产银河麒麟V10系统随记

最近想在麒麟系统上运行.NET 6程序&#xff0c;经过一番折腾最终完成了&#xff0c;简单记录一下。目标系统:CPU: aarch64架构&#xff08;ARM64)操作系统&#xff1a;银河麒麟V10高级服务器系统银河麒麟V10系统&#xff08;以下简称麒麟&#xff09;使用的是redhat类似的dnf包…

SQL优化大法

一、查询SQL尽量不要使用select *&#xff0c;而是具体字段 1、反例 SELECT * FROM user2、正例 SELECT id,username,tel FROM user3、理由 节省资源、减少网络开销。 可能用到覆盖索引&#xff0c;减少回表&#xff0c;提高查询效率。 注意&#xff1a;为节省时间&#x…

spring boot 整合mybatis

1、添加依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><dependency><groupId>com.oracle</groupId><artifactId>ojdbc6</art…