扩展运算符 vs Rest 参数:前端新人别再傻傻分不清了!


扩展运算符 vs Rest 参数:前端新人别再傻傻分不清了!

  • 扩展运算符 vs Rest 参数:前端新人别再傻傻分不清了!
    • 先甩一句狠话:... 这三个点,就是前端界的“薛定谔的猫”
    • JavaScript 里的 ... 到底在搞什么鬼
    • 扩展运算符:把东西“炸开”的六脉神剑
      • 1. 数组复制——告别“引用陷阱”的绿茶
      • 2. 拼接数组——一行代码搞定“数组合并”
      • 3. 函数调用时“炸开”——代替 apply 的老寒腿
      • 4. 对象合并——“对象版乐高”
    • Rest 参数:把东西“收拢”的乾坤袋
      • 1. 写个求和函数——想传几个传几个
      • 2. 和解构搭配——“提取剩余”的骚操作
      • 3. 对象里也能 rest——“剔除敏感字段”神器
      • 4. 函数参数“收拢”之后,arguments 可以退休了
    • 合并对象时的坑:浅拷贝、顺序、Symbol 全给你摆明白
      • 1. 浅拷贝翻车现场
      • 2. 属性覆盖顺序实验
      • 3. Symbol 键会不会丢?
    • 函数参数太多?Rest 一招鲜,代码立马清爽
    • 遇到 Bug 别慌:排查思路来了
      • 1. 展开对象报错?先查浏览器版本
      • 2. 扩展 null/undefined 会炸?
      • 3. rest 放中间?引擎直接掀桌子
    • 开发老鸟私藏技巧
      • 1. 一行去重(Set + 扩展)
      • 2. 提取“除了前两个以外的所有参数”
      • 3. React 传 props——香还是坑?
      • 4. 性能敏感场景慎用扩展
    • 你以为你懂了?来几个反直觉的例子测测你
      • 1. 函数定义是 rest,但调用时我塞了个数组?
      • 2. `{...obj}` 和 `Object.assign({}, obj)` 真的一样吗?
      • 3. 箭头函数里能用 rest 吗?当然能,但注意 this 已经挂掉了
    • 结尾再啰嗦两句

扩展运算符 vs Rest 参数:前端新人别再傻傻分不清了!

——深夜群聊语音转文字,想到哪儿说到哪儿,别嫌我嘴碎


先甩一句狠话:… 这三个点,就是前端界的“薛定谔的猫”

没看源码之前,你以为它只是一个省略号;看完源码之后,你发现它一会儿是“炸开”的 TNT,一会儿是“打包”的麻袋。
最骚的是,它俩长得一毛一样,连亲妈(V8)都靠位置才分得清。
所以,今天咱们不背八股文,直接撸袖子开干,边骂边学,学完还分不清,你来成都请我吃火锅——辣到失忆算我的。


JavaScript 里的 … 到底在搞什么鬼

先给你一张“身份证”,记住就完事儿:

  • 出现在定义阶段(函数签名、解构赋值左边)→ Rest 参数,收破烂的。
  • 出现在调用阶段(函数调用、字面量右边)→ 扩展运算符,炸碉堡的。
// 收破烂functioncollectTrash(...args){// args 是真·数组console.log('今天收的破烂:',args);}// 炸碉堡consta=[1,2];constb=[0,...a,3];// [0,1,2,3]

就这么简单。
记不住?那就背口诀:“定义收,调用炸”
再记不住?那你把口诀抄屏保,老板看见还以为你多爱工作。


扩展运算符:把东西“炸开”的六脉神剑

1. 数组复制——告别“引用陷阱”的绿茶

constgirls=['小A','小B'];constbackupGirls=[...girls];// 真·克隆,不是影子分身backupGirls.push('小C');console.log(girls);// ['小A','小B'] 原数组稳如老狗

注意:浅拷贝!浅拷贝!浅拷贝!
重要的事吼三遍。如果数组里套对象,对象还是同一个地址,改了就一起翻车。

constteam=[{name:'张三',salary:10}];constteamCopy=[...team];teamCopy[0].salary=20;console.log(team[0].salary);// 20,张三的工资一起涨,老板哭晕

2. 拼接数组——一行代码搞定“数组合并”

constfront=['Angular','React'];constback=['Nest','Express'];constfullStack=[...front,'Docker',...back];console.log(fullStack);// ["Angular","React","Docker","Nest","Express"]

3. 函数调用时“炸开”——代替 apply 的老寒腿

constnums=[3,6,1];// 老写法Math.max.apply(null,nums);// 6// 新写法Math.max(...nums);// 6,语义清晰,不绕弯子

4. 对象合并——“对象版乐高”

constcommon={url:'/api',timeout:5000};constdev={url:'/dev-api',debug:true};constprod={url:'/prod-api',retry:3};// 后面属性会覆盖前面constconfig={...common,...dev};// dev 生效constfinal={...config,...prod};// prod 生效console.log(final);

坑点播报

  • 同名属性,后出现的 wins
  • 只遍历可枚举自身属性,Symbol 不会丢,但原型链上的拜拜;
  • 依旧是浅拷贝,嵌套对象请自重。

Rest 参数:把东西“收拢”的乾坤袋

1. 写个求和函数——想传几个传几个

functionsumAll(...numbers){// numbers 是真·数组,能直接 pop、map、forEachreturnnumbers.reduce((a,b)=>a+b,0);}console.log(sumAll(1,2,3));// 6console.log(sumAll());// 0,空数组也不会炸

2. 和解构搭配——“提取剩余”的骚操作

const[host,...others]=[22,33,44,55];console.log(host);// 22console.log(others);// [33,44,55]

3. 对象里也能 rest——“剔除敏感字段”神器

constuser={pwd:'123456',age:18,name:'狗蛋'};const{pwd,...safeUser}=user;sendToClient(safeUser);// pwd 被过滤掉,安全+1

4. 函数参数“收拢”之后,arguments 可以退休了

functionoldWay(){console.log(arguments);// 类数组,没 map 没 filter,难受}newWay(...args){console.log(args);// 真数组,想怎么撸怎么撸}

合并对象时的坑:浅拷贝、顺序、Symbol 全给你摆明白

1. 浅拷贝翻车现场

constsettings={theme:{color:'blue'}};constnewSet={...settings};newSet.theme.color='red';console.log(settings.theme.color);// red,原对象被连带

解决方案:深拷贝请用structuredClone、lodash 克隆函数,或者手写递归,别把扩展运算符当万能胶。

2. 属性覆盖顺序实验

consta={x:1};constb={x:2};constc={...a,...b};// x:2 胜出constd={...b,...a};// x:1 胜出

结论位置靠后的赢,跟 CSS 优先级一个德行。

3. Symbol 键会不会丢?

constkey=Symbol('id');constobj={[key]:666,name:'test'};constclone={...obj};console.log(clone[key]);// 666,还在,放心

函数参数太多?Rest 一招鲜,代码立马清爽

业务代码经常遇到“配置一堆”的鬼需求:

functionlog(level,prefix,...msgs){conststr=msgs.map(i=>`[${prefix}]${i}`).join('\n');console[level](str);}log('warn','订单模块','订单001超时','订单002缺货','订单003被用户骂了');

想加字段?...msgs全接住,后面想怎么玩怎么玩,再也不用数形参个数
再说一遍:rest 必须放最后,否则引擎直接甩脸报错:

functionbad(a,...b,c){}// SyntaxError:Rest parameter must be last formal parameter

遇到 Bug 别慌:排查思路来了

1. 展开对象报错?先查浏览器版本

扩展运算符进 ECMAScript 2018(对象部分),老 IE 肯定跑不动。
生产环境报 “Unexpected token ‘…’”?九成是 Webpack 没配 Babel,或者 browserslist 把 IE 11 漏了。
兜底写法

constclone=typeofstructuredClone==='function'?structuredClone(obj):JSON.parse(JSON.stringify(obj));// 糙但快

2. 扩展 null/undefined 会炸?

constdata=null;constwrap={...data};// 不会报错,只是啥也没有// 但数组展开就凉了:constarr=[...null];// TypeError: null is not iterable

优雅兜底

constsafeArr=[...(data||[])];constsafeObj={...(data||{})};

3. rest 放中间?引擎直接掀桌子

上面演示过了,再写一遍加深印象:

functionf(a,...rest,b){}// 语法错误,直接红屏

开发老鸟私藏技巧

1. 一行去重(Set + 扩展)

constdup=[1,2,2,3];constunique=[...newSet(dup)];// [1,2,3]

Set 去重效率接近 O(n),短数组看不出,上万条数据时真香

2. 提取“除了前两个以外的所有参数”

functionformat(time,user,...args){// args 就是“其他字段”,想怎么拼接怎么拼接return{time,user,comments:args};}

3. React 传 props——香还是坑?

<MyButton{...props}type="primary"/>

好处:写起来爽;:会把所有字段都灌进去,DOM 透传非标准属性会报警告。
解决方案

const{type,children,...rest}=props;return<button className={type}{...rest}>{children}</button>;

只把合法属性往下扔,既优雅又不挨骂

4. 性能敏感场景慎用扩展

扩展运算符每次都会生成新对象/新数组,在 React 渲染、大数据列表里随手一写,内存蹭蹭涨
实测 10w 条记录做...合并,Chrome 性能面板直接飙红。
优化思路

  • 用immer做突变草稿,写完一次性不可变化;
  • 或者上结构共享库(immutable-js、mutative),别让 GC 陪你加班。

你以为你懂了?来几个反直觉的例子测测你

1. 函数定义是 rest,但调用时我塞了个数组?

functionfoo(...args){console.log(args);// 二维数组!}foo([1,2,3]);// 输出:[[1,2,3]]

解析:rest 不管三七二十一,把所有实参打包成数组
你传一个数组,它就把这个数组当成第一个元素,整包收走

2.{...obj}Object.assign({}, obj)真的一样吗?

  • 前者不会触发 setter;后者会。
  • 前者无法拷贝属性访问器(getter/setter);后者可以。
  • 前者少一次函数调用,理论上更快(可忽略)。
consto={getx(){console.log('getter跑啦');return1;}};consta={...o};// 啥也没打印constb=Object.assign({},o);// 打印:getter跑啦

3. 箭头函数里能用 rest 吗?当然能,但注意 this 已经挂掉了

constarrow=(...items)=>items.length;console.log(arrow(1,2,3));// 3

箭头函数没有自己的argumentsrest 是唯一的“收拢”选择,也算被迫营业。


结尾再啰嗦两句

别光顾着收藏,动手敲十遍,肌肉记忆才是你的
明天面试再被问到 “扩展和 rest 区别”,你就把这篇文章背()一遍,边背边比划手势
左手张开——“炸开”;右手握拳——“收拢”。
面试官要是还听不懂,你就说:“来,我现场写给你看。”
然后甩出上面任意一段代码,offer 基本稳了

好了,我去撸串了,键盘上都是孜然味。
你啥时候彻底分清了,群里吼一声,我请你喝阔落。

欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。

推荐:DTcode7的博客首页。
一个做过前端开发的产品经理,经历过睿智产品的折磨导致脱发之后,励志要翻身农奴把歌唱,一边打入敌人内部一边持续提升自己,为我们广大开发同胞谋福祉,坚决抵制睿智产品折磨我们码农兄弟!


专栏系列(点击解锁)学习路线(点击解锁)知识定位
《微信小程序相关博客》持续更新中~结合微信官方原生框架、uniapp等小程序框架,记录请求、封装、tabbar、UI组件的学习记录和使用技巧等
《AIGC相关博客》持续更新中~AIGC、AI生产力工具的介绍,例如stable diffusion这种的AI绘画工具安装、使用、技巧等总结
《HTML网站开发相关》《前端基础入门三大核心之html相关博客》前端基础入门三大核心之html板块的内容,入坑前端或者辅助学习的必看知识
《前端基础入门三大核心之JS相关博客》前端JS是JavaScript语言在网页开发中的应用,负责实现交互效果和动态内容。它与HTML和CSS并称前端三剑客,共同构建用户界面。
通过操作DOM元素、响应事件、发起网络请求等,JS使页面能够响应用户行为,实现数据动态展示和页面流畅跳转,是现代Web开发的核心
《前端基础入门三大核心之CSS相关博客》介绍前端开发中遇到的CSS疑问和各种奇妙的CSS语法,同时收集精美的CSS效果代码,用来丰富你的web网页
《canvas绘图相关博客》Canvas是HTML5中用于绘制图形的元素,通过JavaScript及其提供的绘图API,开发者可以在网页上绘制出各种复杂的图形、动画和图像效果。Canvas提供了高度的灵活性和控制力,使得前端绘图技术更加丰富和多样化
《Vue实战相关博客》持续更新中~详细总结了常用UI库elementUI的使用技巧以及Vue的学习之旅
《python相关博客》持续更新中~Python,简洁易学的编程语言,强大到足以应对各种应用场景,是编程新手的理想选择,也是专业人士的得力工具
《sql数据库相关博客》持续更新中~SQL数据库:高效管理数据的利器,学会SQL,轻松驾驭结构化数据,解锁数据分析与挖掘的无限可能
《算法系列相关博客》持续更新中~算法与数据结构学习总结,通过JS来编写处理复杂有趣的算法问题,提升你的技术思维
《IT信息技术相关博客》持续更新中~作为信息化人员所需要掌握的底层技术,涉及软件开发、网络建设、系统维护等领域的知识
《信息化人员基础技能知识相关博客》无论你是开发、产品、实施、经理,只要是从事信息化相关行业的人员,都应该掌握这些信息化的基础知识,可以不精通但是一定要了解,避免日常工作中贻笑大方
《信息化技能面试宝典相关博客》涉及信息化相关工作基础知识和面试技巧,提升自我能力与面试通过率,扩展知识面
《前端开发习惯与小技巧相关博客》持续更新中~罗列常用的开发工具使用技巧,如 Vscode快捷键操作、Git、CMD、游览器控制台等
《photoshop相关博客》持续更新中~基础的PS学习记录,含括PPI与DPI、物理像素dp、逻辑像素dip、矢量图和位图以及帧动画等的学习总结
日常开发&办公&生产【实用工具】分享相关博客》持续更新中~分享介绍各种开发中、工作中、个人生产以及学习上的工具,丰富阅历,给大家提供处理事情的更多角度,学习了解更多的便利工具,如Fiddler抓包、办公快捷键、虚拟机VMware等工具

吾辈才疏学浅,摹写之作,恐有瑕疵。望诸君海涵赐教。望轻喷,嘤嘤嘤

非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。愿斯文对汝有所裨益,纵其简陋未及渊博,亦足以略尽绵薄之力。倘若尚存阙漏,敬请不吝斧正,俾便精进!

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

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

相关文章

AI测试技术白皮书:从自动化到智能化的演进之路

目录 引言&#xff1a;AI重塑软件质量保障第一章&#xff1a;AI驱动自动化测试框架 1.1 概念&#xff1a;从“脚本回放”到“意图理解”1.2 核心技术&#xff1a;自愈测试与视觉识别1.3 代码实现&#xff1a;智能元素定位器1.4 流程图&#xff1a;AI辅助测试生命周期1.5 Promp…

基于nodejs和vue框架的理发店会员管理系统设计与实现thinkphp

目录理发店会员管理系统设计与实现摘要系统架构功能模块技术实现创新点总结项目技术支持可定制开发之功能亮点源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作理发店会员管理系统设计与实现摘要 该系统基于Node.js、Vue.js和ThinkPHP框架开…

AiPy 是什么?你的第一个本地 AI 牛马来啦

AiPy 是什么&#xff1f;你的第一个本地 AI 牛马来啦 在以前&#xff0c;我对 AI Agent 的认知大多停留在 GPT、DeepSeek、Grok 这类对话型大模型上。它们擅长回答问题、提供建议&#xff0c;但如果需要完成具体任务&#xff0c;比如操作本地文件、分析数据或自动化工作流&…

互联网政务平台如何解决微信公众号公式导入?

富文本编辑器集成文档处理与图片上传功能开发全纪实 作为一名独立开发网站的技术人员&#xff0c;近期我正全身心投入到富文本编辑器功能的优化中&#xff0c;重点攻克粘贴 Word 图片以及多种文档导入时图片自动上传和样式保留的难题。以下是我在这一过程中的详细记录。 一、…

基于nodejs和vue框架的物业维修服务预约平台thinkphp

目录基于Node.js和Vue框架的物业维修服务预约平台&#xff08;ThinkPHP摘要&#xff09;项目技术支持可定制开发之功能亮点源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作基于Node.js和Vue框架的物业维修服务预约平台&#xff08;ThinkPHP摘…

Gitee 2026全景解读:为何中国开发者正加速拥抱国产代码托管平台

Gitee 2026全景解读&#xff1a;为何中国开发者正加速拥抱国产代码托管平台 在中国数字化转型浪潮中&#xff0c;代码托管平台已成为开发者不可或缺的基础设施。Gitee作为本土代码托管服务的领军者&#xff0c;正以其独特的本土化优势重构中国开发者的协作生态。最新数据显示&…

系统找不到mfcm120u.dll文件 无法启动怎么修复? 免费下载方法分享

在使用电脑系统时经常会出现丢失找不到某些文件的情况&#xff0c;由于很多常用软件都是采用 Microsoft Visual Studio 编写的&#xff0c;所以这类软件的运行需要依赖微软Visual C运行库&#xff0c;比如像 QQ、迅雷、Adobe 软件等等&#xff0c;如果没有安装VC运行库或者安装…

高性能计算集群监控数据集:多维度系统资源利用与网络性能分析-科学研究、数据分析、企业应用-CPU使用率、内存占用、磁盘状态、网络延迟、数据包丢失率、网络吞吐量-集群资源优化、性能瓶颈识别、异常检测算法

高性能计算集群监控数据集分析报告 引言与背景 在当今数字化时代&#xff0c;高性能计算集群的稳定运行对于科学研究、数据分析和企业应用至关重要。集群资源的有效监控和管理直接影响系统性能、应用响应时间和整体用户体验。本数据集提供了一个高性能计算集群在25天运行周期…

msvcp90.dll文件丢失找不到 如何修复? 免费下载方法分享

在使用电脑系统时经常会出现丢失找不到某些文件的情况&#xff0c;由于很多常用软件都是采用 Microsoft Visual Studio 编写的&#xff0c;所以这类软件的运行需要依赖微软Visual C运行库&#xff0c;比如像 QQ、迅雷、Adobe 软件等等&#xff0c;如果没有安装VC运行库或者安装…

系统找不到msvcp110.dll文件 如何修复? 免费下载方法分享

在使用电脑系统时经常会出现丢失找不到某些文件的情况&#xff0c;由于很多常用软件都是采用 Microsoft Visual Studio 编写的&#xff0c;所以这类软件的运行需要依赖微软Visual C运行库&#xff0c;比如像 QQ、迅雷、Adobe 软件等等&#xff0c;如果没有安装VC运行库或者安装…

如何通过单北斗形变监测提升水库的安全性?

单北斗形变监测技术在水库安全管理中展现出显著作用。通过高精度实时监测&#xff0c;能够及时掌握水库及周边的形变情况&#xff0c;确保可以在隐患发生的初期及时响应。这项技术的核心在于单北斗GNSS系统&#xff0c;具备稳定性和准确性&#xff0c;支持多点同步监测。针对复…

Java 是企业级应用开发的核心语言之一,广泛应用于大型系统、后端服务和分布式架构中

Java 是企业级应用开发的核心语言之一&#xff0c;广泛应用于大型系统、后端服务和分布式架构中。以下是针对“Java&#xff08;企业级开发核心&#xff09;”的详细学习路径解析与实战建议&#xff1a;1. 基础语法 变量与数据类型&#xff1a;掌握基本数据类型&#xff08;int…

C++ 是一门广泛应用于高性能计算、游戏开发、嵌入式系统和底层系统编程的语言

C 是一门广泛应用于高性能计算、游戏开发、嵌入式系统和底层系统编程的语言。其核心优势在于对内存的精细控制和接近硬件的操作能力。以下是围绕你提供的“核心学习路径”进行的详细解析与实战示例。1. 基础语法 变量与数据类型 int a 10; double b 3.14; char c A; bool fl…

LoRA 训练过程详解:从 0 到“懂你”的进化之路

接上文&#xff1a;LoRA 矩阵分解&#xff1a;Rank&#xff08;秩&#xff09;与数值的确定机制 “梯度更新”听起来很抽象&#xff0c;我们用一个教大模型写诗的例子&#xff0c;来看看矩阵 A 和 B 是怎么一步步“长脑子”的&#xff0c;也就是它们如何从随机数和零值&#xf…

在 PyTorch 中训练一个简单的神经网络包括以下几个核心步骤:定义模型、准备数据、选择损失函数和优化器、编写训练循环

在 PyTorch 中训练一个简单的神经网络包括以下几个核心步骤&#xff1a;定义模型、准备数据、选择损失函数和优化器、编写训练循环。下面以一个简单的线性回归任务为例&#xff0c;演示完整流程。✅ 步骤 1&#xff1a;导入必要的库 import torch import torch.nn as nn import…

协议十年演进

下面给你一条从工程系统、平台化与自治治理视角出发的 「协议十年演进路线&#xff08;2025–2035&#xff09;」。 这里的“协议”不只是通信格式&#xff0c;而是系统之间如何理解彼此、约束彼此、协同运行的根本机制。一、核心判断&#xff08;一句话&#xff09;未来十年&a…

Go(又称Golang)是一种由Google开发的静态类型、编译型编程语言,设计初衷是解决大规模软件工程中的效率与协作问题

Go&#xff08;又称Golang&#xff09;是一种由Google开发的静态类型、编译型编程语言&#xff0c;设计初衷是解决大规模软件工程中的效率与协作问题。其核心优势在于高性能、高并发支持、语法简洁&#xff0c;并具备高效的垃圾回收机制和强大的标准库。 特性与应用场景&#x…

ZYNQ MPSOC VCU介绍

关注、星标公众号&#xff0c;精彩内容每日送达 来源&#xff1a;网络素材1 什么是VCU?VCU 的全称是 Video Codec Unit&#xff0c;即视频编解码单元&#xff0c; Zynq UltraScale MPSoC 系列产品分为三种类型&#xff0c;分别是 CG 型器件、 EG 型器件和 EV 型器件&#xff0…

硬核解析:英伟达机器人的技术内核与落地场景全攻略硬核解析:英伟达机器人的技术内核与落地场景全攻略

2026年CES展会上&#xff0c;英伟达Reachy Mini机器人&#xff08;酷似“瓦力”&#xff09;的流畅互动惊艳全场&#xff0c;这背后并非单纯的设计创新&#xff0c;而是其“全栈技术体系多元场景适配”的实力彰显。作为AI与机器人领域的核心玩家&#xff0c;英伟达正通过一套从…

监控十年演进

下面给你一条从工程实践、系统复杂度与自治运维视角出发的 「监控十年演进路线&#xff08;2025–2035&#xff09;」。 这里的“监控”不只是看指标&#xff0c;而是系统如何被理解、被约束、被治理。一、核心判断&#xff08;一句话&#xff09;未来十年&#xff0c;监控将从…