【ES6基础】展开语法(Spread syntax)
开篇
今天是元宵佳节,在此小编祝大家元宵佳节快乐!今天小编在这里给大家继续介绍ES6的语法糖——展开语法(Spread syntax)。
展开语法用"..."进行表示,展开语法将可迭代的对象拆分成单个的值(语法层面展开)。
展开语法通常用于将可迭代的对象的值传递到函数的参数中。今天小编将从以下方面进行介绍:
- 函数传参中的应用
- 数组的相关应用
- 剩余参数的应用
本篇文章阅读时间预计6分钟
01
函数传参中的应用
ES6之前,如果我们希望将数组作为参数传递给函数中的参数,我们可以使用Function的apply()方法。如下段代码所示:
function myFunction(a, b) {
return a + b;
}
var data = [1, 4];
var result = myFunction.apply(null, data);
console.log(result); //Output "5”
从上述代码,apply方法接受一个数组,将它们分拆成单个参数传递给函数进行调用。
ES6的展开语法能让我们以更简洁的方式进行调用,如下段代码所示:
function myFunction(a, b) {
return a + b;
}
let data = [1, 4];
let result = myFunction(...data);
console.log(result); //Output "5”
代码运行期间,JavaScript解释器调用myFunction之前,将会用1,4表达式替换...运算符:
let result = myFunction(...data);
上述代码将会进行如下替换:
let result = myFunction(1,4);
替换后,函数中的代码将会继续执行。
02
数组的相关应用
数组的合并
展开语法可将数组添加到另外一个数组中,成为其中的一部分。
let array1 = [2,3,4];
let array2 = [1, ...array1, 5, 6, 7];
console.log(array2); //Output "1, 2, 3, 4, 5, 6, 7”
代码运行期间,如下代码:
let array2 = [1, ...array1, 5, 6, 7];
上述代码将会替换成如下代码:
let array2 = [1, 2, 3, 4, 5, 6, 7];
在push方法中的运用
有时候,我们需要将一个数组的内容追加到另一个数组的末尾,ES6之前我们可以这么做,如下段代码所示:
var array1 = [2,3,4];
var array2 = [1];
Array.prototype.push.apply(array2, array1);
console.log(array2); //Output "1, 2, 3, 4”
ES6的展开语法能以更简洁的形式实现,如下段代码所示:
let array1 = [2,3,4];
let array2=[1];
array2.push(...array1);
console.log(array2); //Output "1, 2, 3, 4”
代码运行期间,如下代码:
array2.push(...array1);
上述代码将会替换成如下代码:
array2.push(2, 3, 4);
传递多个数组参数
我们可以使用展开语法传递多个数组进行参数传递,如下段代码所示:
let array1 = [1];
let array2 = [2];
let array3 = [...array1, ...array2, ...[3, 4]];//multi arrayspread
let array4 = [5];
function myFunction(a, b, c, d, e) {
return a+b+c+d+e;
}
let result = myFunction(...array3, ...array4); //multi array spread
console.log(result); //Output "15”
03
剩余参数的应用
我们知道JS函数内部有个arguments对象,可以拿到全部实参。现在ES6给我们带来了一个新的对象,可以拿到除开始参数外的参数,即剩余参数,我们可以使用展开语法...进行获取。
ES6之前,我们可以这样获取剩余参数,如下段代码所示:
function myFunction(a, b) {
const args = Array.prototype.slice.call(arguments, myFunction.length);
console.log(args);
}
myFunction(1, 2, 3, 4, 5); //Output "3, 4, 5”
ES6中,上述代码我们可以这样改下,如下段代码所示:
function myFunction(a, b, ...args) {
console.log(args); //Output "3, 4, 5"
}
myFunction(1, 2, 3, 4, 5);
是不是很简单,有个我们需要注意的事项,一旦函数中的参数第一个参数使用剩余参数,便不能添加任何参数,否则将会抛出错误。例如下段代码所示:
function fn(...rest,foo) {}
//Output "SyntaxError: Rest parameter must be last formal parameter"
04
小节
今天的内容就到这里,展开语法糖是不是特别的酷啊,在日后的开发中,我们尽量使用新的语法糖替代旧的写法。让我们代码看起来更加干净、整洁、易懂。
- Volley解析之表单提交篇
- JAVA中重写equals()方法的同时要重写hashcode()方法
- 调用CodeSmith类库实现代码生成(含源码)
- 1分钟生成Net对象的注释
- Android Studio之gradle的配置与介绍
- MLlib中的随机森林和提升方法
- android JNI调用机制
- Android开发小窍门通过泛型简化findViewById类型转换
- lodash源码分析之缓存使用方式的进一步封装
- Android LruCache技术原理
- RecyclerView 必知必会
- AndFix使用感想
- iOS GPUImage源码解读(一)
- Android 几种网络请求的区别与联系
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- C++雾中风景9:emplace_back与可变长模板
- .NET Core类库中读取配置文件
- Spring Boot 2.0 项目实现自同步AD域账号 顶
- RHEL 4.7 (64bit) 环境安装 GCC 4.6 测试记录 (更新至gcc-4.6.1)
- 重写GridFsTemplate类, MongoDB文件库实现同名文件共存 顶
- Spring Boot 2.0 执行器端点(Actuator Endpoint)精简模式 顶
- 【iOS开发】iOS 动画详解
- 【iOS开发】UITableView优化
- 【iOS开发】启动时间优化,runloop的一个小技术点
- 【iOS开发】浅谈iOS列表分页数据管理
- 【iOS开发】Cocoapods详解-使用及创建私有库
- 【iOS开发】RxSwift中的Subject(PublishSubject/BehaviorSubject/ReplaySubject/Variable)
- 【iOS开发】UITableView和UICollectionView多种类型cell处理,更好地组织代码
- 【iOS开发】RxSwift入门:从Observable.create讲起
- 【iOS开发】iOS路由引入及遇到的问题