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 的值才能被展开。常见不可展开类型包括 null、undefined、普通对象(无迭代器)、数字、布尔值。
- 报错示例:
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数据转换


