学习前端第三十二天(Rest 参数与 Spread 语法,变量作用域,闭包)
一、Rest 参数与 Spread 语法
1.rest参数
...变量名:收集剩余的参数并存进指定数组中,需要放到最后;
2.arguments变量
// arguments,以参数在参数列表中的索引作为键,存储所有参数,以类数组对象的形式输出所有函数参数
// 箭头函数没有arguments和this对象,会去上级函数找,没有上级函数就报错
function fn3(a, b, ...c) {
console.log(arguments);
console.log(Array.from(arguments)); // 转为数组
}
fn3(1, 2, 3, 4, 5, 6);
3.Spread 语法
使用...,把任意可迭代对象“展开”到参数列表中
// 可传入多个可迭代对象
const arr2 = [9, 77, 85, 12, 33];
console.log(Math.max(...arr, ...arr2)); // 85
// 可以与常规值结合使用
console.log(Math.max(1, ...arr, 2, ...arr2, 25)); //85
// 合并数组
let sumArr = [0, ...arr, ...arr2];
// 常用的复制数组方法
let arr4 = [...arr];
使用 spread 语法将任意可迭代对象转换为字符数组
let str = "Hello";
console.log([...str]); // ['H', 'e', 'l', 'l', 'o']
let s = new Set();
s.add("css").add("html");
console.log([...s]); // ['css', 'html']
let m = new Map();
m.set("name", "jack").set("age", 20)
console.log([...m]); // [Array(2), Array(2)]
4.浅复制/深复制
浅复制:
// “001” => ["a","b","c"];// const arr = [1, "001", 2, 3];const arr = [1, ["a", "b", "c"], 2, 3];// 浅复制,修改一个影响到另一个const newArr = [...arr]; // [1, "001", 2, 3]; newArr[1][0] = "X";console.log(arr);//[1, ['X', 'b', 'c'], 2, 3]
深复制方法一:
// “001” => ["a","b","c"];// const arr = [1, "001", 2, 3];const arr = [1, ["a", "b", "c"], 2, 3];// 深复制,修改一个不会影响到另一个const newArr = JSON.parse(JSON.stringify(arr)); // [1, "001", 2, 3];newArr[1][0] = "X";console.log(newArr); //[1, ['X', 'b', 'c'], 2, 3]console.log(arr); //[1, ['a', 'b', 'c'], 2, 3]
方法二方法三:
<script src="../../../lodash.min.js"></script><script>// 深度复制复杂对象 (面试题)const o1 = { a: undefined, b: function () { }, list: [1, 2, 3] };// 方法一:JSON.parse(JSON.stringify(o1)),无法复制复杂的// 方法二:递归深度赋值Object.entries(o1).forEach((el) => {if (Array.isArray(el[1])) {newObj[el[0]] = [];el[1].forEach((elx) => {newObj[el[0]].push(elx);});} else {newObj[el[0]] = el[1];}});// 方法三:第三方代码,引用js文件后,使用里面规定的代码实现const newObj = _.cloneDeep(o1);console.log(newObj)
二、变量作用域,闭包
1.代码块
如果在代码块 {...} 内声明了一个变量,那么这个变量只在该代码块内可见。
对于 if,for 和 while 等,在 {...} 中声明的变量也仅在内部可见。
let i 位于 {...} 之外。但是 for 构造很特殊:在其中声明的变量被视为块的一部分。
2.嵌套函数(重要)
如果一个函数是在另一个函数中创建的,该函数就被称为“嵌套”函数。
function makeCounter() {let count = 0;return function() {return count++;};
}let counter = makeCounter();alert( counter() ); // 0
alert( counter() ); // 1
相关文章:
学习前端第三十二天(Rest 参数与 Spread 语法,变量作用域,闭包)
一、Rest 参数与 Spread 语法 1.rest参数 ...变量名:收集剩余的参数并存进指定数组中,需要放到最后; 2.arguments变量 // arguments,以参数在参数列表中的索引作为键,存储所有参数,以类数组对象的形式输出所有函数参数 // 箭头…...
mysql从入门到起飞+面试基础题
mysql基础 MySQL基础 企业面试题1 代码 select m.id,m.num from ( select t.id as id,count(1) num from ( select ra.requester_id as id from RequestAccepted raunion all select ra.accepter_id as id from RequestAccepted ra ) t group by t.id ) m group by id ord…...
设计模式:命令模式
文章目录 一、什么是命令模式二、命令模式结构三、命令模式实现步骤四、命令模式应用场景 一、什么是命令模式 它允许将请求封装为对象,一个请求对应于一个命令,将发出命令的责任和执行命令的责任分割开。每一个命令都是一个操作:请求的一方…...
setinterval和settimeout区别在于
setinterval和settimeout区别在于 执行次数和执行频率 setInterval和setTimeout的主要区别在于执行次数和执行频率。以下是详细介绍:12 setTimeout是一次性的定时器,它在设定的延迟时间之后执行一次函数,然后停止。setInterval是重复性的定…...
shell_结束进程脚本
结束进程的shell脚本如下: #!/bin/bash# kill all process ps aux|grep "local" | grep -v grep | awk {print $2} | while read line; do kill -9 $line; done 解析: ps aux 命令常用于查看当前系统中运行的进程,以及它们所占用…...
GDPU unity游戏开发 碰撞器与触发器
砰砰叫,谁动了她的奶酪让你的小鹿乱撞了。基于此,亦即碰撞与触发的过程。 碰撞器与触发器的区别 通俗点讲,碰撞器检测碰撞,触发器检测触发,讲了跟没讲似的。碰撞器是用来检测碰撞事件的,在unity中ÿ…...
IP地址定位技术在网络安全中的作用
在当今数字化时代,网络安全已经成为企业、政府和个人面临的重要挑战之一。随着互联网的普及和网络攻击的增加,保护个人隐私和防止网络犯罪变得尤为重要。在这一背景下,IP地址定位技术作为网络安全的重要组成部分之一,发挥着关键作…...
R语言中,查看经安装的包,查看已经加载的包,查看特定包是否已经安装,安装包,更新包,卸载包
创建于:2024.5.4 R语言中,查看经安装的包,查看已经加载的包,查看特定包是否已经安装,安装包,更新包,卸载包 文章目录 1. 查看经安装的包2. 查看已经加载的包3. 查看特定包是否已经安装4. 安装包…...
spring boot3单模块项目工程搭建-下(个人开发模板)
⛰️个人主页: 蒾酒 🔥系列专栏:《spring boot实战》 目录 写在前面 上文衔接 常用依赖介绍以及整合 web组件 测试组件 样板代码生成 数据库连接器 常用工具包 面向切面编程 ORM框架 数据连接池 接口测试、文档导出 缓存中间件 参数校…...
精准清理 MongoDB 数据:删除集合的正确姿势
在 MongoDB 数据库管理中,数据清理是维护数据库性能和保持数据一致性的关键步骤之一。而删除集合是实现数据清理的重要手段之一。在这个信息爆炸的时代,了解如何正确地执行集合删除操作至关重要。本文将深入探讨 MongoDB 中删除集合的常用方法、最佳实践…...
java 执行修改语句
你可以使用Java中的JDBC(Java Database Connectivity)来执行修改语句。以下是一个示例: import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement;public class Main {public…...
【Linux系统化学习】网络套接字(编写简单的UDP服务端和客户端)
目录 理解源IP地址和目的IP地址 认识端口号 端口号和进程ID的区别 源端口号和目的端口号 认识TCP和UDP协议 TCP协议 UDP协议 网络字节序 socket编程接口 socket常见API sockaddr结构 简单的UDP网络程序 UDP服务端 创建套接字 填充本地网络信息 绑定 收取消息 …...
MFC 列表控件修改实例(源码下载)
1、本程序基于前期我的博客文章《MFC下拉菜单打钩图标存取实例(源码下载)》 2、程序功能选中列表控件某一项,修改这一项的按钮由禁止变为可用,双击这个按钮弹出对话框可对这一项的记录数据进行修改,点击确定保存修改数…...
QT设计模式:模板模式
基本概念 模板模式(Template Pattern)是一种行为型设计模式,它定义了一个操作中的算法的模板,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。 实现的模块有࿱…...
8.k8s中网络资源service
目录 一、service资源概述 二、service资源类型 1.ClusterIP类型 2.service的nodeport类型 3.service的loadbalancer类型(了解即可) 4.service的externalname类型(了解即可) 三、nodeport的端口范围设置和svc的endpoint列表 1.修…...
51单片机keil编程中遇到的问题(持续更新)
字符无法打印报错 查看特殊功能寄存器名字的时候也会报错,因为无法编译通过,导致头文件的定义内容无法查找 keil编译中 error C127: ‘xx’: invalid storage class 这种一般是在编写头文件或源文件时,在声明函数的结尾没有添加分号&…...
C++类和对象详解(一)
目录 面向过程和面向对象初步认识类的引入类的定义类的两种定义方式声明和定义全部放在类体中 声名定义分离 类的作用域成员变量命名规则建议访问限定符 类的封装类的实例化类对象模型类的对象大小的计算扩展 结构体内存对齐规则 感谢各位大佬对我的支持,如果我的文章对你有用,…...
SCI论文检索报告长什么样?怎么出具?一文了解!
1、SCI检索报告是什么 SCI数据库收录最能反映基础学科研究水平和论文质量,该检索系统收录的科技期刊比较全面,可以说它是集中各个学科高质优秀论文的精粹,评职晋升、项目申报、评奖评优等很多关键时期,都需要开具已经在SCI发表的论…...
UE4_Water插件_Buoyancy组件使用
water插件提供了一个浮力Actor蓝图类。 需要注意的几个问题: 1、StaticMesh需要替换根组件。 2、需要模拟物理设置质量。 3、需要添加浮力组件,设置浮力点,应用水中牵引力。...
OceanBase学习1:分布式数据库与集中式数据库的差异
目录 1. 传统集中式数据库 2. 数据库中间件的分库分表 3. 分布式数据库的基本特点及对比分析 4. OceanBase和传统数据库的对比 5. 小结 1. 传统集中式数据库 优点 成熟稳定:经过近40年的发展,应用到各行各业,产品技术非常成熟稳定行业适配性强:适配…...
从数据清洗到游戏开发:C++ std::string替换函数的5个意想不到的妙用
从数据清洗到游戏开发:C std::string替换函数的5个意想不到的妙用 在C开发者的日常工作中,std::string的替换操作常被视为基础技能,但它的潜力远不止于简单的文本处理。当我们将视线投向更广阔的领域——从游戏开发到数据工程,从安…...
阿里云:数据分析Agent白皮书——AI重构数据消费 2026
这份由阿里云与瓴羊发布的《数据分析 Agent 白皮书 ——AI 重构数据消费》,立足 DataAI 融合趋势,系统阐述了数据分析 Agent 的发展背景、技术架构、代表产品、行业实践、落地方法与未来方向,核心围绕AI 重构企业数据消费模式展开,…...
个人作品集展示的最佳实践与工具选择
对于设计师、摄影师、插画师等创意人士而言,个人作品集是展示专业能力的重要窗口。 如何将作品以最佳方式呈现给潜在客户或雇主,是每个创意人士都需要认真思考的问题。 PDF格式因其跨平台兼容性和排版稳定性,成为作品集展示的首选格式。 它能…...
基于DBO优化算法的三维无人机路径规划应用:蜣螂算法的MATLAB代码实现
基于蜣螂优化算法的三维无人机路径规划应用matlab代码 DBO优化三维无人机路径规划无人机要在复杂三维地形里找到最优路径,这事听着简单实际操作起来真能让人头秃。传统算法容易陷入局部最优,这时候就得请出蜣螂优化算法(DBO)这种新…...
效率革命:借力快马AI生成智能安装脚本,一键部署复杂工程环境
今天想和大家分享一个提升开发效率的实用技巧:如何用AI生成智能安装脚本,快速搭建复杂的微服务演示环境。最近在尝试搭建一个包含用户服务、订单服务和商品服务的本地演示环境时,发现手动配置实在太耗时,于是尝试用InsCode(快马)平…...
告别电子教材获取难题:tchMaterial-parser如何让资源下载效率提升8倍
告别电子教材获取难题:tchMaterial-parser如何让资源下载效率提升8倍 【免费下载链接】tchMaterial-parser 国家中小学智慧教育平台 电子课本下载工具 项目地址: https://gitcode.com/GitHub_Trending/tc/tchMaterial-parser 您是否曾为获取教学资源而在多个…...
GLM-OCR .NET平台集成指南:C#调用与桌面应用开发
GLM-OCR .NET平台集成指南:C#调用与桌面应用开发 如果你是一名.NET开发者,正在琢磨怎么给你的桌面应用或者Web项目加上一个“眼睛”,让它能看懂图片里的文字,那这篇文章就是为你准备的。OCR(光学字符识别)…...
Rustup离线安装完整指南:在没有网络的环境中搭建Rust开发平台
Rustup离线安装完整指南:在没有网络的环境中搭建Rust开发平台 【免费下载链接】rustup The Rust toolchain installer 项目地址: https://gitcode.com/gh_mirrors/ru/rustup 你是否曾经需要在完全隔离的网络环境中安装Rust开发工具链?ᾑ…...
如何通过OpCore-Simplify在30分钟内完成黑苹果EFI自动化配置
如何通过OpCore-Simplify在30分钟内完成黑苹果EFI自动化配置 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify OpCore-Simplify是一款专注于自动化OpenC…...
别再只用STFT了!用Python手把手实现短时DCT(STDCT),搞定音频压缩和特征提取
别再只用STFT了!用Python手把手实现短时DCT(STDCT),搞定音频压缩和特征提取 如果你处理过音频信号,大概率用过短时傅里叶变换(STFT)——这个在语音识别、音乐分析中无处不在的工具。但当你面对一…...
