网站首页 > 技术文章 正文
在 JavaScript 中,...data 是 展开语法(Spread Syntax),它是 ES6(ECMAScript 2015)引入的特性,主要用于展开可迭代对象(如数组、对象、字符串等)的元素或属性。
1. 基本作用
...data 的作用是 将 data 展开,具体行为取决于它的使用场景:
- 在数组或函数调用中:展开数组或可迭代对象的元素。
- 在对象中:展开对象的可枚举属性。
2. 常见使用场景
(1) 展开数组(Array Spread)
const arr1 = [1, 2, 3];
const arr2 = [...arr1, 4, 5]; // 展开 arr1 的元素
console.log(arr2); // [1, 2, 3, 4, 5]
相当于:
const arr2 = [1, 2, 3, 4, 5];
(2) 函数调用时展开参数(Function Arguments)
function sum(a, b, c) {
return a + b + c;
}
const numbers = [1, 2, 3];
console.log(sum(...numbers)); // 6,相当于 sum(1, 2, 3)
(3) 复制数组(浅拷贝)
const original = [1, 2, 3];
const copy = [...original]; // 创建新数组,元素相同
console.log(copy); // [1, 2, 3]
console.log(original === copy); // false(不同引用)
(4) 合并数组
const arr1 = [1, 2];
const arr2 = [3, 4];
const merged = [...arr1, ...arr2];
console.log(merged); // [1, 2, 3, 4]
(5) 展开对象(Object Spread)
const obj1 = { a: 1, b: 2 };
const obj2 = { ...obj1, c: 3 }; // 展开 obj1 的属性
console.log(obj2); // { a: 1, b: 2, c: 3 }
注意:如果属性名冲突,后面的会覆盖前面的:
const obj1 = { a: 1, b: 2 };
const obj2 = { ...obj1, a: 99 }; // a 会被覆盖
console.log(obj2); // { a: 99, b: 2 }
(6) 字符串展开
const str = "hello";
const chars = [...str]; // 展开字符串
console.log(chars); // ["h", "e", "l", "l", "o"]
3. 与 ...rest(剩余参数)的区别
... 语法还可以用于 剩余参数(Rest Parameters),但它们的作用相反:
展开语法(Spread):把数组/对象 展开 成独立的元素/属性。
剩余参数(Rest):把多个元素/参数 收集 成一个数组。
示例:
// 展开语法(Spread)
const arr = [1, 2, 3];
console.log(...arr); // 1 2 3
// 剩余参数(Rest)
function logArgs(...args) {
console.log(args); // [1, 2, 3]
}
logArgs(1, 2, 3);
4. 注意事项
4.1. 只能用于可迭代对象:
- 数组、字符串、Set、Map 等可迭代对象可以使用 ... 展开。
- 普通对象({})在 ES2018 后才支持 ... 展开。
4.2. 浅拷贝(Shallow Copy):
const obj = { a: { b: 1 } };
const copy = { ...obj };
copy.a.b = 2; // 会影响原对象!
console.log(obj.a.b); // 2
如果对象嵌套较深,需要使用深拷贝(如 JSON.parse(JSON.stringify(obj)) 或 lodash.cloneDeep)。
4.3. 不能直接展开非可迭代对象:
const num = 123;
console.log(...num); // TypeError: num is not iterable
5.总结
场景 | 示例 | 作用 |
展开数组 | [...arr] | 复制或合并数组 |
展开对象 | { ...obj } | 复制或合并对象 |
函数调用 | func(...args) | 展开数组作为参数 |
剩余参数 | function(...args) | 收集剩余参数 |
好了,爱学习的小伙伴,更多精彩,关注不迷路哟~
猜你喜欢
- 2025-08-01 装饰材料——JS防水涂料,施工必知!
- 2025-08-01 p5.js 圆弧的用法
- 2025-08-01 通过JS获取你当前的网络状况?建议大家学一学~
- 2025-08-01 JavaScript 事件循环机制详解
- 2025-05-09 js防水涂料的使用方法(js防水涂料的防水作用机理)
- 2025-05-09 JavaScript 可选链操作符详解(javascript选项)
- 2025-05-09 Express.js 创建Node.js Web应用(express搭建)
- 2025-05-09 JavaScript 强制回流问题及优化方案
- 2025-05-09 OS.js – 开源的 Web OS 系统,赶快来体验
- 2025-05-09 祝各位节(圆周率日)快乐(国际数学节国际圆周率日)
- 08-03MySQL数据库的预处理详解
- 08-03《阿常·MySQL 70讲》全套教学视频
- 08-03隐式等待、显示等待和强制等待
- 08-03零基础C#上位机框架项目实例(完结篇)
- 08-03一文搞懂构建Web内容的技术
- 08-03西门子WINCC中的VBScript(VBS)常用于自动化脚本开发
- 08-03力控和sql2000之间的数据转储
- 08-03组态王|通过日历控件选择时间段查询历史报警
- 1521℃桌面软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具
- 626℃Dify工具使用全场景:dify-sandbox沙盒的原理(源码篇·第2期)
- 527℃MySQL service启动脚本浅析(r12笔记第59天)
- 492℃服务器异常重启,导致mysql启动失败,问题解决过程记录
- 492℃启用MySQL查询缓存(mysql8.0查询缓存)
- 479℃「赵强老师」MySQL的闪回(赵强iso是哪个大学毕业的)
- 461℃mysql服务怎么启动和关闭?(mysql服务怎么启动和关闭)
- 458℃MySQL server PID file could not be found!失败
- 最近发表
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (84)
- 标签用于 (71)
- 主键只能有一个吗 (77)
- c#console.writeline不显示 (95)
- pythoncase语句 (88)
- es6includes (74)
- sqlset (76)
- windowsscripthost (69)
- apt-getinstall-y (100)
- node_modules怎么生成 (87)
- chromepost (71)
- flexdirection (73)
- c++int转char (80)
- htmlbackground-image (68)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- asynccallback (71)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)