网站首页 > 技术文章 正文
在 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-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 祝各位节(圆周率日)快乐(国际数学节国际圆周率日)
- 2025-05-09 JavaScript中Date对象的用法详解(javascript date对象)
- 2025-05-09 JavaScript 中的运算符优先级(javascript中的运算符分为哪几种?)
- 2025-05-09 web前端JavaScript笔记四 正则表达式
- 2025-05-09 超赞 react.js 自定义虚拟滚动条MagicSroll
- 最近发表
- 标签列表
-
- cmd/c (64)
- c++中::是什么意思 (83)
- 标签用于 (65)
- 主键只能有一个吗 (66)
- c#console.writeline不显示 (75)
- pythoncase语句 (81)
- es6includes (73)
- sqlset (64)
- windowsscripthost (67)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- chromepost (65)
- c++int转char (75)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- & (66)
- java (73)
- js数组插入 (83)
- linux删除一个文件夹 (65)
- mac安装java (72)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)