javascript展开运算符是什么_它有哪些实用场景【教程】

发布时间 - 2026-01-28 00:00:00    点击率:
展开运算符(...)是JavaScript中实现可迭代对象解构与值平铺的底层能力,用于数组合并、浅拷贝、函数传参等场景,但仅支持实现了Symbol.iterator的对象,不可展开null、undefined等非可迭代值。

展开运算符(...)不是语法糖,它是 JavaScript 中真正改变数据操作方式的底层能力——它把“可迭代”变成“可解构”,把“多个值”变成“单个参数”或“独立元素”。

展开运算符在数组中怎么用?

最常见的是替代 concat() 或手动拼接数组,但它本质是“把数组里的每一项拿出来,平铺到当前位置”。

  • 合并数组:[...arr1, ...arr2]arr1.concat(arr2) 更直观,且支持任意数量数组
  • 浅拷贝数组:[...arr] 创建新数组,但嵌套对象仍共享引用(这点常被忽略)
  • 函数调用传参:Math.max(...numbers) 可直接展开,而 Math.max(numbers) 会返回 N

    aN
  • 错误写法:[...null][...undefined] 会抛出 TypeError: undefined is not iterable

对象展开运算符为什么不能直接深拷贝?

{...obj} 只执行一层浅拷贝:顶层属性被复制,但属性值如果是对象、数组或函数,引用关系不变。

  • 正确用途:覆盖默认配置 —— {...defaults, ...userInput},后项同名属性会覆盖前项
  • 陷阱:const a = { x: { y: 1 } }; const b = {...a}; b.x.y = 2; 会导致 a.x.y 也变成 2
  • 不支持类数组对象(如 arguments)直接展开到对象中:{...arguments} 会静默失败(仅在严格模式下报错)

展开运算符和剩余参数(...)是同一符号,但语义相反

展开(spread)是“向外打散”,剩余(rest)是“向内收拢”。同一个 ... 在不同位置,行为完全相反。

  • 函数定义中:function f(a, b, ...rest) { } —— rest 是数组,收集多余参数
  • 函数调用中:f(...[1, 2, 3]) —— 展开数组,等价于 f(1, 2, 3)
  • 解构赋值中:const [first, ...others] = arr; —— others 是剩余元素组成的数组
  • 注意:... 必须是最后一个参数(rest)或最后一个元素(spread),否则语法报错

哪些值不能被展开?展开失败时怎么排查?

只有实现了 Symbol.iterator 的值才能被展开。常见不可展开类型包括 nullundefined、普通对象(无迭代器)、数字、布尔值。

  • 报错示例:console.log(...null);TypeError: null is not iterable
  • 安全做法:展开前检查是否为真值且可迭代 —— Array.isArray(val) || typeof val[Symbol.iterator] === 'function'
  • 字符串是特例:可展开为 Unicode 字符数组([...'?‍?'] 得到 ['?', '\u200d', '?'],注意 emoji 组合字符)
  • NodeList、Map、Set 都可展开;但普通对象不行,除非手动加 Symbol.iterator

最容易被忽略的是:展开运算符不会触发 getter,也不会调用 toString()valueOf();它只认迭代协议。如果你看到展开后结果异常,先查 Symbol.iterator 是否存在,而不是怀疑数据内容。


# javascript  # java  # node  # 可迭代对象  # 为什么  # Array  # NULL  # 运算符  # math  # const  # 字符串  # map  # console  # undefined  # symbol  # function  # 对象  # typeof  # 严格模式  # 迭代  # 的是  # 报错  # 平铺  # 后项  # 实现了  # 如果你  # 多个  # 它是 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Gemini怎么用新功能实时问答_Gemini实时问答使用【步骤】  Laravel的辅助函数有哪些_Laravel常用Helpers函数提高开发效率  教你用AI润色文章,让你的文字表达更专业  网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?  如何基于PHP生成高效IDC网络公司建站源码?  如何在 Pandas 中基于一列条件计算另一列的分组均值  香港网站服务器数量如何影响SEO优化效果?  php中::能调用final静态方法吗_final修饰静态方法调用规则【解答】  1688铺货到淘宝怎么操作 1688一键铺货到自己店铺详细步骤  Python图片处理进阶教程_Pillow滤镜与图像增强  奇安信“盘古石”团队突破 iOS 26.1 提权  java获取注册ip实例  如何用AI帮你把自己的生活经历写成一个有趣的故事?  Laravel如何实现邮箱地址验证功能_Laravel邮件验证流程与配置  齐河建站公司:营销型网站建设与SEO优化双核驱动策略  Laravel怎么集成Vue.js_Laravel Mix配置Vue开发环境  高端云建站费用究竟需要多少预算?  详解CentOS6.5 安装 MySQL5.1.71的方法  Win11搜索不到蓝牙耳机怎么办 Win11蓝牙驱动更新修复【详解】  如何登录建站主机?访问步骤全解析  Laravel定时任务怎么设置_Laravel Crontab调度器配置  如何快速启动建站代理加盟业务?  谷歌浏览器下载文件时中断怎么办 Google Chrome下载管理修复  ,在苏州找工作,上哪个网站比较好?  Laravel如何优雅地处理服务层_在Laravel中使用Service层和Repository层  Python正则表达式进阶教程_复杂匹配与分组替换解析  如何快速搭建二级域名独立网站?  google浏览器怎么清理缓存_谷歌浏览器清除缓存加速详细步骤  Laravel如何配置和使用队列处理异步任务_Laravel队列驱动与任务分发实例  香港服务器选型指南:免备案配置与高效建站方案解析  Laravel队列由Redis驱动怎么配置_Laravel Redis队列使用教程  Laravel Sail是什么_基于Docker的Laravel本地开发环境Sail入门  UC浏览器如何设置启动页 UC浏览器启动页设置方法  Windows10如何更改计算机工作组_Win10系统属性修改Workgroup  如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程  SQL查询语句优化的实用方法总结  Laravel如何生成PDF或Excel文件_Laravel文档导出工具与使用教程  Windows Hello人脸识别突然无法使用  如何为不同团队 ID 动态生成多个“认领值班”按钮  Win11任务栏卡死怎么办 Windows11任务栏无反应解决方法【教程】  lovemo网页版地址 lovemo官网手机登录  网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?  免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?  Laravel如何使用集合(Collections)进行数据处理_Laravel Collection常用方法与技巧  如何做网站制作流程,*游戏网站怎么搭建?  Windows11怎样设置电源计划_Windows11电源计划调整攻略【指南】  如何在景安服务器上快速搭建个人网站?  javascript中的数组方法有哪些_如何利用数组方法简化数据处理  如何自定义建站之星网站的导航菜单样式?  Laravel API资源类怎么用_Laravel API Resource数据转换