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

目录
相关文章
|
7月前
|
存储 算法 程序员
【C++20 新特性 】模板参数包展开与Lambda初始化捕获详解
【C++20 新特性 】模板参数包展开与Lambda初始化捕获详解
376 3
|
开发框架 .NET C#
c#数组补充
c#数组的几个简单的补充
45 0
|
1月前
|
Arthas 监控 Java
-x [展开层数] 的详细用法和举例?
-x [展开层数] 的详细用法和举例?
26 5
|
5月前
|
存储 数据库 索引
面试题ES问题之动态映射的定义如何解决
面试题ES问题之动态映射的定义如何解决
42 1
ES6新增循环对象的四种方法(通俗易懂)
ES6新增循环对象的四种方法(通俗易懂)
|
JavaScript 前端开发
ES6学习(四)—字符串的新增方法
ES6学习(四)—字符串的新增方法
|
JavaScript 前端开发 网络架构
每天3分钟,重学ES6-ES12(四)函数的补充 展开语法
每天3分钟,重学ES6-ES12(四)函数的补充 展开语法
84 0
ts重点学习108-枚举类型知识点补充
ts重点学习108-枚举类型知识点补充
67 0
ts重点学习108-枚举类型知识点补充
ts重点学习49-函数得参数得处理方式
ts重点学习49-函数得参数得处理方式
94 0
ts重点学习49-函数得参数得处理方式
ts重点学习135-声明合并
ts重点学习135-声明合并
81 0
ts重点学习135-声明合并