ES6知识点补充——剩余参数、展开语法

简介: JS查漏补缺系列是我在学习JS高级语法时做的笔记,通过实践费曼学习法进一步加深自己对其的理解,也希望别人能通过我的笔记能学习到相关的知识点。这一次我们来了解剩余参数、展开语法

剩余参数——rest 操作符

剩余运算符(the rest operator),它的样子看起来和展开操作符一样,但是它是 用于解构数组和对象

rest 操作符可以用于创建有一个变量来接受多个参数的函数。 这些参数被储存在一个可以在函数内部读取的数组中。
用法:rest 操作符语法(...args)

function howMany(...args) {
  return "You have passed " + args.length + " arguments.";
}
console.log(howMany(0, 1, 2));
console.log(howMany("string", null, [1, 2, 3], { }));

控制台将显示字符串 You have passed 3 arguments. 和 You have passed 4 arguments.。
使用 rest 参数,就不需要查看 args 数组,并且允许我们在参数数组上使用 map()、filter() 和 reduce()。

剩余参数和arguments的区别
剩余参数只包含那些没有对应形参的实参,而 arguments 对象包含了传给函数的所有实参

  • arguments对象不是一个真正的数组,而rest参数是一个真正的数组,可以进行数组的所有操作;
  • arguments是早期的ECMAScript中为了方便去获取所有的参数提供的一个数据结构,而rest参数是ES6中提供 并且希望以此来替代arguments的;

    注意:剩余参数必须放到最后一个位置,否则会报错

展开语法—— spread 运算符

展开运算符 (spread)是三个点 ( ... ),可以将一个数组转为用逗号分隔的参数序列。
说的通俗易懂点,有点像化骨绵掌,把一个大元素给打散成一个个单独的小元素。
剩余运算符也是用三个点 ( ... )表示,它的样子看起来和展开操作符一样,但是它是用于解构数组和对象。

使用 spread 运算符展开数组项

ES6 引入了_展开操作符_,可以展开数组以及需要多个参数或元素的表达式。
下面的 ES5 代码使用了 apply() 来计算数组的最大值:

var arr = [6, 89, 3, 45];
var maximus = Math.max.apply(null, arr);
//maximus 的值为 89

我们必须使用 Math.max.apply(null, arr),因为 Math.max(arr) 返回 NaN。
Math.max() 函数中需要传入的是一系列由逗号分隔的参数,而不是一个数组。
且这里使用apply有些不合适,因为我们一般使用apply来指定this。
展开操作符可以提升代码的可读性,使代码易于维护。

const arr = [6, 89, 3, 45];
const maximus = Math.max(...arr);
//maximus 的值应该是 89。

...arr 返回一个解压的数组。 也就是说,它_展开_数组。 然而,展开操作符只能够在函数的参数中或者数组中使用。 下面的代码将会报错:

const spreaded = ...arr;

构建对象字面量时ES2018(ES9)

const names = ["abc", "cba", "nba"]
const info = {name: "why", age: 18}

//构建对象字面量时ES2018(ES9)
const obj = { ...info, address: "广州市", ...names }
console.log(obj)

补充:展开运算符其实进行的是一个浅拷贝

const info = {
  name: "why",
  friend: { name: "kobe" }
}

const obj = { ...info, name: "coderwhy" }
// console.log(obj)
obj.friend.name = "james"

console.log(info.friend.name)

上面代码在内存中的展示:
image.png

目录
相关文章
|
8月前
|
安全 Java API
Spring Boot 3.x 在 2.x基础上有什么重大的改进?
Spring Boot 3.x于2022年11月发布,带来了诸多重大更新。主要改进包括:最低要求Java 17,整合Jakarta EE 9,优化实例化和配置支持,基于Spring Framework 6.x,引入AOT编译,增强GraalVM原生映像支持,改进日志管理和集成测试,提供更详细的Actuator监控功能,以及对Spring Cloud的兼容性更新。这些变化为现代云原生应用开发提供了更强支持。
602 36
|
11月前
|
JavaScript 前端开发
多种模块格式,包括 ES, CommonJS, UMD, AMD, SystemJS 和 IIFE的区别点分别是什么?
【10月更文挑战第20天】在实际应用中,选择合适的模块格式需要根据项目的需求、目标环境以及开发团队的习惯等因素来综合考虑。不同的模块格式都有其自身的优势和适用场景,合理选择可以提高代码的组织性、可维护性和性能。
390 8
|
11月前
|
设计模式 前端开发 Java
|
JSON JavaScript 数据格式
文本-----wangEditor的使用,设置和获取内容,展示HTML无样式怎么办????console同步展示怎样写,Vue的配置在Vue3配置文件中的配置,是editor中的v-model绑定的值
文本-----wangEditor的使用,设置和获取内容,展示HTML无样式怎么办????console同步展示怎样写,Vue的配置在Vue3配置文件中的配置,是editor中的v-model绑定的值
|
前端开发 JavaScript UED
前端 js 经典:async 和 await
前端 js 经典:async 和 await
362 2
|
JSON 小程序 JavaScript
一分钟教你学会微信小程序的页面刷新
本文指导如何在微信小程序中实现页面刷新功能。首先,在页面JSON配置开启刷新,然后在JS的`onPullDownRefresh`方法中重置数据并调用数据加载函数。在数据请求方法中,使用`wx.showLoading`显示加载提示,请求完成后用`wx.stopPullDownRefresh`结束刷新并更新数据。监听`onPullDownRefresh`事件触发数据获取。最后,自定义下拉刷新样式,并总结关键在于使用`wx.startPullDownRefresh`启动和`wx.stopPullDownRefresh`停止刷新。
1424 2
|
算法 测试技术
华为机试HJ67:24点游戏算法
华为机试HJ67:24点游戏算法
256 0
|
人工智能 算法 自动驾驶
2023全球智能汽车AI挑战赛,火热招募中!
2023全球智能汽车AI挑战赛,火热招募中!
460 1
|
JavaScript
【Vue】npm run serve 和 npm run dev 有什么区别
【Vue】npm run serve 和 npm run dev 有什么区别
|
关系型数据库 MySQL 网络安全
Nacos运行一段时间后无法连接到MySQL
Nacos运行一段时间后无法连接到MySQL
546 1