ES6/ES11知识点 续三

rest参数

Rest 参数(Rest Parameters)是 ES6 引入的一个非常实用的特性。它允许函数接受不定数量的参数,并将这些参数作为一个数组存储,从而简化了处理可变参数的代码。

Rest 参数语法

Rest 参数使用 … 语法,紧跟着参数名。它会将传递给函数的所有剩余参数收集成一个数组。

function sum(...numbers) {return numbers.reduce((total, num) => total + num, 0);
}console.log(sum(1, 2, 3));  // 输出:6
console.log(sum(10, 20, 30, 40)); // 输出:100

在这个例子中,…numbers 捕获所有传递给 sum 函数的参数,并将它们作为数组 numbers 处理。

Rest 参数的特点

只能是最后一个参数

Rest 参数必须是函数参数列表中的最后一个参数。如果在其他参数后使用 …,会抛出语法错误。

// 正确
function greet(message, ...names) {console.log(message);console.log(names);
}// 错误
function greet(...names, message) {  // 报错console.log(names);console.log(message);
}

能够接收任意数量的参数

Rest 参数允许函数接收任意数量的传递参数,并将它们收集到一个数组中。即使没有传递任何参数,Rest 参数仍然是一个空数组。

function logMessages(...messages) {console.log(messages);  // 输出参数数组
}logMessages("Hello", "World");  // 输出:["Hello", "World"]
logMessages();                 // 输出:[]

与普通参数一起使用

Rest 参数可以与普通的命名参数一起使用,但它必须位于参数列表的最后。

function displayInfo(name, age, ...hobbies) {console.log(`Name: ${name}`);console.log(`Age: ${age}`);console.log(`Hobbies: ${hobbies.join(", ")}`);
}displayInfo("Alice", 30, "Reading", "Hiking", "Cooking");  
// 输出:
// Name: Alice
// Age: 30
// Hobbies: Reading, Hiking, Cooking

Rest 参数与 arguments 对象的区别

arguments 对象是一个类数组对象,表示传递给函数的所有参数。然而,arguments 对象不是真正的数组,不能直接使用数组的方法(如 forEach、map、filter)。此外,arguments 是一个在所有函数中都存在的对象,并不支持解构。

与此不同,Rest 参数是一个真正的数组,可以直接使用数组的方法。

function test() {console.log(arguments);  // 类数组对象console.log(Array.isArray(arguments));  // 输出:false
}function testRest(...args) {console.log(args);  // 数组console.log(Array.isArray(args));  // 输出:true
}test(1, 2, 3);
testRest(1, 2, 3);

Rest 参数与解构结合

你还可以将 Rest 参数与解构语法结合使用,从而灵活地提取函数参数。

function splitData(first, second, ...rest) {console.log(first);  // 输出:1console.log(second); // 输出:2console.log(rest);   // 输出:[3, 4, 5, 6]
}splitData(1, 2, 3, 4, 5, 6);

结论

Rest 参数是一个非常强大的特性,能够使函数更灵活,支持处理不定数量的参数。它比 arguments 对象更易用,因为它是一个真正的数组,并且可以结合解构语法进行更灵活的处理。使用 Rest 参数,你可以避免处理大量的条件判断,使代码更加简洁和易读。

扩展运算符

扩展运算符(Spread Operator)是 ES6 引入的一种语法,它使用 … 表示符,可以展开数组或对象的元素。它与 Rest 参数(…)看起来相似,但用途和语境有所不同。

扩展运算符的基本语法

扩展运算符用于将一个数组或对象的元素“展开”成单个值,可以更简洁地进行合并、克隆等操作。

// 数组的扩展
const arr1 = [1, 2, 3];
const arr2 = [...arr1, 4, 5];console.log(arr2);  // 输出:[1, 2, 3, 4, 5]// 对象的扩展
const obj1 = { name: "Alice", age: 25 };
const obj2 = { ...obj1, city: "New York" };console.log(obj2);  // 输出:{ name: "Alice", age: 25, city: "New York" }

数组的扩展运算符

扩展运算符可以将数组展开为单个元素,常见的用途包括合并数组和克隆数组。

合并数组

你可以使用扩展运算符将多个数组合并成一个新的数组。

const arr1 = [1, 2];
const arr2 = [3, 4];
const combinedArr = [...arr1, ...arr2];console.log(combinedArr);  // 输出:[1, 2, 3, 4]

克隆数组

使用扩展运算符可以快速克隆一个数组。它会展开原数组的所有元素,生成一个新数组。

const arr1 = [1, 2, 3];
const arr2 = [...arr1];console.log(arr2);  // 输出:[1, 2, 3]
arr1[0] = 100;
console.log(arr1);  // 输出:[100, 2, 3]
console.log(arr2);  // 输出:[1, 2, 3]  (原数组未改变)

传递数组元素作为函数参数

你可以使用扩展运算符将数组的元素传递给函数参数。

const arr = [1, 2, 3];
function sum(a, b, c) {return a + b + c;
}
console.log(sum(...arr));  // 输出:6

对象的扩展运算符

扩展运算符也可以用于对象,它用于浅拷贝对象或合并多个对象。

克隆对象

扩展运算符可以创建一个对象的浅拷贝,复制对象的所有可枚举属性。

const obj1 = { name: "Alice", age: 25 };
const obj2 = { ...obj1 };console.log(obj2);  // 输出:{ name: "Alice", age: 25 }
obj1.age = 26;
console.log(obj1);  // 输出:{ name: "Alice", age: 26 }
console.log(obj2);  // 输出:{ name: "Alice", age: 25 }  (浅拷贝,原对象不受影响)

合并对象

多个对象可以使用扩展运算符合并成一个新对象。如果多个对象有相同的键,后面的对象的值会覆盖前面的。

const obj1 = { name: "Alice" };
const obj2 = { age: 25 };
const obj3 = { city: "New York" };const mergedObj = { ...obj1, ...obj2, ...obj3 };
console.log(mergedObj);  // 输出:{ name: "Alice", age: 25, city: "New York" }

如果键重复,后面的对象会覆盖前面的对象中的同名属性:

const obj1 = { name: "Alice", age: 25 };
const obj2 = { age: 26, city: "New York" };const mergedObj = { ...obj1, ...obj2 };
console.log(mergedObj);  // 输出:{ name: "Alice", age: 26, city: "New York" }

合并数组对象

扩展运算符不仅可以用于合并简单对象,也可以用于合并数组中对象的属性。

const obj1 = { a: 1, b: 2 };
const obj2 = { b: 3, c: 4 };
const obj3 = { ...obj1, ...obj2 };console.log(obj3);  // 输出:{ a: 1, b: 3, c: 4 }

扩展运算符与 concat 的比较

扩展运算符和 concat 方法都可以用来合并数组,但它们有不同的使用方式和行为:

const arr1 = [1, 2];
const arr2 = [3, 4];// 使用 concat 合并
const combinedArr1 = arr1.concat(arr2);
console.log(combinedArr1);  // 输出:[1, 2, 3, 4]// 使用扩展运算符合并
const combinedArr2 = [...arr1, ...arr2];
console.log(combinedArr2);  // 输出:[1, 2, 3, 4]

虽然两者都可以实现相同的效果,扩展运算符语法更加简洁易读。

扩展运算符的应用场景

  • 数组克隆与合并:可以快速复制数组或合并多个数组。
  • 对象合并与拷贝:适用于对象的浅拷贝和合并多个对象。
  • 简化函数参数传递:可以将数组展开为函数参数列表,避免使用 apply()。

结论

扩展运算符(…)是 ES6 中的一个非常强大且简洁的语法工具,能够高效地处理数组和对象的合并、克隆等操作。它不仅使代码更加简洁,也提高了可读性。特别是在处理不定参数和函数调用时,扩展运算符为开发者提供了更简洁的语法。

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

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

相关文章

记忆翻牌游戏:认知科学与状态机的交响曲

目录 记忆翻牌游戏:认知科学与状态机的交响曲引言第一章 网格空间拓扑学1.1 自适应网格算法1.2 卡片排布原理第二章 状态机设计2.1 状态跃迁矩阵2.2 时空关联模型第三章 记忆强化机制3.1 认知衰减曲线3.2 注意力热力图第四章 动画引擎设计4.1 翻牌运动方程4.2 粒子反馈系统第五…

STM32外设-GPIO输出(不含复用)

STM32外设-GPIO输出(不含复用) 一,GPIO模式简介1,输入模式2,输出模式3,模拟模式4,复用模式 二,输出模式详解1, 输出类型1,推挽输出:2,…

58认知干货:创业经验分享及企业形式的汇总

机会永远都是留给有眼光、能发现机会的人,而不是留给有准备的人!往往机会就在身边,普罗大众却无法发现,而真正适合创业的人,天然具备这方面的能力。 当然后天的补足也未尝不可:“故常有欲以观其微,常无欲以观其妙。””引用《道德经》 读懂这句话自然便会拥有对商业和…

修复笔记:获取 torch._dynamo 的详细日志信息

一、问题描述 在运行项目时,遇到与 torch._dynamo 相关的报错,并且希望获取更详细的日志信息以便于进一步诊断问题。 二、相关环境变量设置 通过设置环境变量,可以获得更详细的日志信息: set TORCH_LOGSdynamo set TORCHDYNAM…

Spark,Idea中编写Spark程序 2

Idea中编写Spark程序 一、修改pom.xml文件 <build><sourceDirectory>src/main/scala</sourceDirectory><testSourceDirectory>src/test/scala</testSourceDirectory> <!-- 添加必要的插件以打包scala程序--><plugins><plu…

【AI提示词】黑天鹅模型专家

提示说明 详细解释黑天鹅模型的理论背景、定义、分类及其在不同领域的应用。 提示词 # Role: 黑天鹅模型专家## Profile - language: 中文 - description: 详细解释黑天鹅模型的理论背景、定义、分类及其在不同领域的应用 - background: 黑天鹅模型是尼尔斯莫尔提出的理论&a…

ARM Linux 设备树

Linux 设备驱动开发详解&#xff1a;基于最新的Linux 4.0内核, 机械工业出版社, 宋宝华, 2015 1. 设备树的起源 • 背景: ARM架构中大量板级代码冗余&#xff0c;硬编码在mach-xxx目录&#xff0c;设备树&#xff08;Device Tree&#xff09;引入结构化描述硬件。 • 目的: 减…

每日c/c++题 备战蓝桥杯(洛谷P1015 [NOIP 1999 普及组] 回文数)

洛谷P1015 [NOIP 1999 普及组] 回文数 题解 题目描述 P1015 回文数 是NOIP 1999普及组的经典模拟题。题目要求如下&#xff1a; 给定一个数N&#xff08;十进制&#xff09;和进制K&#xff08;2≤K≤16&#xff09;&#xff0c;将N转换为K进制表示后&#xff0c;通过以下操…

Linux线程深度解析:从基础到实践

Linux线程深度解析&#xff1a;从基础到实践 一、线程基础概念 1. 进程与线程定义 进程&#xff1a;一个正在运行的程序&#xff0c;是操作系统资源分配的最小单位&#xff08;拥有独立的地址空间、文件描述符等资源&#xff09;&#xff0c;状态包括就绪、运行、阻塞。线程…

php学习笔记(全面且适合新手)

以下是专为 PHP 7.4 初学者设计的全面学习文档&#xff0c;涵盖基础语法、细节语法和进阶语法&#xff0c;结合 PHP 7.4 新特性与实战案例&#xff0c;帮助系统掌握 PHP 开发&#xff1a; 为什么特地做7.4的笔记而不做8的&#xff1f;因为公司用的7.4&#xff0c;哈哈 一、基…

开源分布式数据库(TiDB)

TiDB是由PingCAP 开发的开源分布式数据库&#xff0c;兼容 MySQL 协议&#xff0c;集成了 HTAP&#xff08;混合事务和分析处理&#xff09;的能力&#xff0c;能够同时处理在线事务和实时分析任务。 2015 年&#xff0c;TiDB 在 GitHub 创建&#xff0c;2025 年&#xff0c;Ti…

SpringBoot+Mybatis通过自定义注解实现字段加密存储

&#x1f60a; 作者&#xff1a; 一恍过去 &#x1f496; 主页&#xff1a; https://blog.csdn.net/zhuocailing3390 &#x1f38a; 社区&#xff1a; Java技术栈交流 &#x1f389; 主题&#xff1a; SpringBootMybatis实现字段加密 ⏱️ 创作时间&#xff1a; 2025年04月…

Windows 10系统中找回MySQL 8的root密码

以下是 在Windows 10系统中找回MySQL 8的root密码 的详细步骤&#xff1a; 步骤1&#xff1a;停止MySQL服务 按 Win R 输入 services.msc&#xff0c;打开「服务」管理器。找到 MySQL80&#xff08;或其他自定义服务名&#xff09;&#xff0c;右键选择 停止。 步骤2&#xf…

【计网】互联网的组成

回顾&#xff1a; 互联网(Internet)&#xff1a;它是一个专有名词&#xff0c;是一个特定的互连网&#xff0c;它是指当下全球最大的、最开放的、由众多网络相互连接而形成的特定的的互连网&#xff0c;采用TCP/IP协议族作为通信规则。 一、互联网的组成部分 从互联网的工作方…

【vue3】黑马程序员前端Vue3小兔鲜电商项目【八】

黑马程序员前端Vue3小兔鲜电商项目【八】登录页面 登录页面的主要功能就是表单校验和登录登出业务。 账号密码 accountpasswordcdshi0080123456cdshi0081123456cdshi0082123456cdshi0083123456cdshi0084123456cdshi0085123456cdshi0086123456cdshi0087123456cdshi0088123456 …

C++学习:六个月从基础到就业——C++11/14:右值引用与移动语义

C学习&#xff1a;六个月从基础到就业——C11/14&#xff1a;右值引用与移动语义 本文是我C学习之旅系列的第三十九篇技术文章&#xff0c;也是第三阶段"现代C特性"的第一篇&#xff0c;主要介绍C11/14中引入的右值引用和移动语义。查看完整系列目录了解更多内容。 引…

基于Qlearning强化学习的电梯群控系统高效调度策略matlab仿真

目录 1.算法仿真效果 2.算法涉及理论知识概要 2.1 Q-learning强化学习原理 2.2 基于Q-learning的电梯群控系统建模 3.MATLAB核心程序 4.完整算法代码文件获得 1.算法仿真效果 matlab2022a仿真结果如下&#xff08;完整代码运行后无水印&#xff09;&#xff1a; 仿真操作…

31.软件时序控制方式抗干扰

软件时序控制方式扛干扰 1. 软件时序控制抗干扰的时间逻辑2. 应用案例 1. 软件时序控制抗干扰的时间逻辑 &#xff08;1&#xff09;将受软件控制的功能或软件检测到的状态一一罗列&#xff1b; &#xff08;2&#xff09;将其中的潜在干扰和敏感信号分开&#xff1b; &#x…

Ubuntu环境下使用uWSGI服务器【以flask应用部署为例】

0、前置内容说明 首先要知道WSGI是什么&#xff0c;关于WSGI服务器的介绍看这篇&#xff1a;WSGI&#xff08;Web Server Gateway Interface&#xff09;服务器 由于从Python 3.11开始限制了在系统级 Python 环境中使用 pip 安装第三方包&#xff0c;以避免与系统包管理器&am…

d3_v7绘制折线图

<!DOCTYPE html> <html><head><meta charsetutf-8><title>需求</title><script src"https://d3js.org/d3.v7.min.js"></script><style>* {margin: 0;padding: 0;}html, body {width: 100%;height: 100%;displ…