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

发布时间 - 2026-01-22 00:00:00    点击率:
展开运算符(...)是JavaScript中将可迭代对象解包为独立值的底层能力,用于数组合并、函数传参、浅拷贝、类数组转换等,但不支持深拷贝、null/undefined展开及原型属性继承。

展开运算符(...)不是语法糖,是 JavaScript 中真正改变数据操作方式的底层能力——它把“可迭代对象”转成一串独立值,不是复制,而是解包。

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

最常见用途:替代 Array.prototype.concat()Array.prototype.push.apply()。它不修改原数组,只生成新结构。

  • [...arr1, ...arr2] 合并数组比 arr1.concat(arr2) 更直观,且支持多个源、中间插入字面量(如 [...a, 0, ...b]
  • 函数调用时传参:Math.max(...numbers) 可直接展开,避免写 Math.max.apply(null, numbers)
  • 浅拷贝数组:const copy = [...original],但注意嵌套对象仍共享引用
  • 转换类数组对象(如 argumentsNodeList)为真数组:[...document.querySelectorAll('div')]

对象展开有哪些限制和陷阱?

对象展开只处理**自身可枚举属性**,且按声明顺序覆盖——后写的同名键会覆盖前面的。

  • 合并对象:{ ...a, ...b } 等价于 Object.assign({}, a, b),但不能展开 nullundefined(会报 TypeError: Cannot spread non-iterable instance
  • 无法展开原型链上的属性,也不能展开 symbol 键(除非显式用 Object.getOwnPropertySymbols() 配合)
  • 深拷贝?不行。例如 const obj = { x: { y: 1 } }; const copy = { ...obj };,修改 copy.x.y 仍会影响 obj.x.y

为什么函数参数里用 ...rest 和展开运算符不是一回事?

虽然都用 ... 符号,但语义相反:一个是「收」(rest 参数),一个是「放」(展开)。混淆会导致常见错误。

  • rest 参数用于函数定义:function f(a, ...rest) { }rest 是数组;展开用于调用或字面量:f(...arr)
  • rest 只能出现在参数列表末尾;展开可以出现在任意位置(如 [first, ...middle, last]
  • rest 不接受空位(function(...[]) {} 报错),但展开允许空数组:[...[], 1][1]

哪些地方不能用展开运算符?

不是所有“看起来像集合”的东西都能展开,关键看是否实现了 Symbol.iterator

  • 普通对象默认不可展开(会报错),必须是可迭代对象(ArrayStringMapSet、生成器函数返回值等)
  • arguments 在非箭头函数中可用,但箭头函数没有 arguments,得靠 rest 参数代替
  • DOM 元素集合(如 HTMLCollection)在较老浏览器(如 IE)中不支持展开,需先转成数组
  • 展开 undefinednull 直接抛错,建议加判断:...(arr ?? [])

真正容易被忽略的是:展开运算符的执行时机是**运行时解包**,不是编译期宏替换。这意味着它依赖目标值的实际类型和迭代器实现,动态性高,但也意味着出错往往在数据进入时才暴露,而不是写代码时。


# javascript  # java  # html  # node  # 浏览器  # app  # 可迭代对象  # 为什么 


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


相关推荐: 详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)  在线制作视频网站免费,都有哪些好的动漫网站?  Linux系统命令中tree命令详解  Laravel Admin后台管理框架推荐_Laravel快速开发后台工具  Java解压缩zip - 解压缩多个文件或文件夹实例  极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?  Laravel如何编写单元测试和功能测试?(PHPUnit示例)  如何在 React 中条件性地遍历数组并渲染元素  如何撰写建站申请书?关键要点有哪些?  Laravel如何实现用户角色和权限系统_Laravel角色权限管理机制  Laravel表单请求验证类怎么用_Laravel Form Request分离验证逻辑教程  最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?  Windows10电脑怎么设置虚拟光驱_Win10右键装载ISO镜像文件  网易LOFTER官网链接 老福特网页版登录地址  mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?  Laravel项目结构怎么组织_大型Laravel应用的最佳目录结构实践  Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑  长沙做网站要多少钱,长沙国安网络怎么样?  中山网站制作网页,中山新生登记系统登记流程?  Laravel如何使用Facades(门面)及其工作原理_Laravel门面模式与底层机制  黑客入侵网站服务器的常见手法有哪些?  Laravel怎么多语言本地化设置_Laravel语言包翻译与Locale动态切换【手册】  Firefox Developer Edition开发者版本入口  Laravel怎么进行浏览器测试_Laravel Dusk自动化浏览器测试入门  Laravel Vite是做什么的_Laravel前端资源打包工具Vite配置与使用  猎豹浏览器开发者工具怎么打开 猎豹浏览器F12调试工具使用【前端必备】  如何在万网开始建站?分步指南解析  千库网官网入口推荐 千库网设计创意平台入口  三星网站视频制作教程下载,三星w23网页如何全屏?  Laravel如何实现用户注册和登录?(Auth脚手架指南)  Laravel怎么集成Log日志记录_Laravel单文件与每日日志配置及自定义通道【详解】  JavaScript中如何操作剪贴板_ClipboardAPI怎么用  如何在阿里云完成域名注册与建站?  php嵌入式断网后怎么恢复_php检测网络重连并恢复硬件控制【操作】  jquery插件bootstrapValidator表单验证详解  PythonWeb开发入门教程_Flask快速构建Web应用  javascript中闭包概念与用法深入理解  Laravel Octane如何提升性能_使用Laravel Octane加速你的应用  Laravel的辅助函数有哪些_Laravel常用Helpers函数提高开发效率  Python自然语言搜索引擎项目教程_倒排索引查询优化案例  在线制作视频的网站有哪些,电脑如何制作视频短片?  如何用腾讯建站主机快速创建免费网站?  如何快速使用云服务器搭建个人网站?  网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?  php做exe能调用系统命令吗_执行cmd指令实现方式【详解】  googleplay官方入口在哪里_Google Play官方商店快速入口指南  UC浏览器如何切换小说阅读源_UC浏览器阅读源切换【方法】  Laravel如何处理异常和错误?(Handler示例)  Laravel如何为API生成Swagger或OpenAPI文档  高性能网站服务器配置指南:安全稳定与高效建站核心方案