你以为你懂 ...?其实坑才刚开始!

前言

在前端圈里,有一个操作符被称作「万能胶水」,有点像哆啦 A 梦的百宝袋,什么都能掏出来,它就是 JavaScript 的扩展运算符 ...,俗称"三点运算符"。

null

虽然看起来只是三个小点点,但用好了,代码能优雅到飞起;用不好,就像胶水乱涂一通,搞得代码又黏又臭。

今天,我们就来盘一盘这三个点到底都能干啥,有啥坑,又该怎么写得更优雅。


数组的"复制+拼接",so easy!

很多时候我们想复制数组,或者合并多个数组。如果你还在用 sliceconcat,那你真的可以退休了:

✅ 替代 slice

ini 复制代码
const original = [1, 2, 3];
const copy = [...original];
console.log(copy); // [1, 2, 3]

这样复制是浅拷贝,不会影响原数组:

ini 复制代码
copy[0] = 100;
console.log(original[0]); // 依然是 1

✅ 合并数组:

ini 复制代码
const a = [1, 2];
const b = [3, 4];
const merged = [...a, ...b];
console.log(merged); // [1, 2, 3, 4]

是不是比 concat() 更清爽?


对象的合并与重写,更丝滑

扩展运算符也能用于对象,但它的行为有点不同:它是按键名覆盖,后面的会覆盖前面的。

ini 复制代码
const base = { a: 1, b: 2 };
const update = { b: 3, c: 4 };

const result = { ...base, ...update };
console.log(result); // { a: 1, b: 3, c: 4 }

🎯 小心坑!

当对象内嵌结构(比如嵌套对象、数组)时,还是浅拷贝哦!

ini 复制代码
const obj = { a: { x: 1 } };
const clone = { ...obj };
clone.a.x = 999;
console.log(obj.a.x); // 999,惊不惊喜?

解决方案:用 structuredClonelodash.cloneDeep 或手撸递归。


函数的参数魔术:rest & spread

这三个点还能玩点参数魔法:

✅ spread(拆开参数):

ini 复制代码
const nums = [1, 2, 3];
console.log(Math.max(...nums)); // 3

等价于 Math.max(1, 2, 3),拆得明明白白。

✅ rest(打包参数):

javascript 复制代码
function sum(...args) {
  return args.reduce((acc, val) => acc + val, 0);
}
console.log(sum(1, 2, 3, 4)); // 10

你可以把任意数量的参数打包进数组,超适合做工具函数。


数组解构的隐藏技巧

... 解构数组时,你可以捕获"剩余"的部分,就像用网捞鱼一样:

scss 复制代码
const [head, ...tail] = [10, 20, 30];
console.log(head); // 10
console.log(tail); // [20, 30]

这在处理响应数据时非常高效,比如:

ini 复制代码
const [first, ...rest] = data.list;

处理主数据和副数据,优雅又清晰。


你可能没注意的细节 ⚠️

❌ 不能乱用在对象中间:

csharp 复制代码
const obj = { a: 1, ...null }; // ❌ 会报错

✅ 可以用在数组/对象的函数参数中:

css 复制代码
function logAll(a, b, ...rest) {
  console.log(a, b, rest);
}
logAll(1, 2, 3, 4); // 1 2 [3, 4]

✍️ 总结

扩展运算符 ... 其实就是 JavaScript 世界的"万能钥匙"。拼接、解构、打包、展开,一个符号搞定各种场景。

但也别盲目崇拜,像对象嵌套那种场景它就无能为力了。掌握它、理解它、敬畏它,才能写出既简洁又健壮的代码。

相关推荐
子兮曰1 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰1 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
前端小万1 天前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝1 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
三十而立洋1 天前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
卡布鲁1 天前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
汉堡大王95271 天前
Jev:不是聊天机器人, 而是一个智能 if 语句
前端·人工智能·后端
梦想很大很大1 天前
从运行事实到回归证据:Workrun 的 Telemetry 与 Evaluation 实践
前端·人工智能·后端
计算机魔术师1 天前
Meta Muse agent 接入 Shopify 的 Shop Pay 实现代理式购物
前端
沙蒿同学1 天前
我用 Go 搭了一条 AI Agent 流水线:从 1 张商品图到一整套淘宝详情页
前端·javascript·后端