网易首页 > 网易号 > 正文 申请入驻

JS这两个符号骗了3年:90%开发者分不清展开和收集

0
分享至


同样的三个点,放在数组前面是"拆快递",放在函数参数里变成"打包行李"。Stack Overflow 2023年开发者调查显示,JavaScript连续11年霸榜最常用语言,但关于展开运算符(spread operator)和剩余运算符(rest operator)的混淆帖,每月新增超过200条。

这不是语法难题,是认知陷阱——长得像双胞胎,性格完全相反。

2009年:ES6之前的"参数地狱"

JavaScript函数曾经有个经典痛点:参数数量不确定时,开发者被迫用`arguments`对象。这个类数组怪物没有`map`、`filter`方法,想操作它得先`Array.prototype.slice.call(arguments)`转一圈。

2015年ES6发布,三个点`...`正式入场。但规范制定者做了个让后世头疼的决定:同一个符号,两种截然相反的行为。社区花了三年才形成统一的教学话术,"拆包vs打包"的类比由此诞生。

MDN文档至今保留这句警告:"Spread syntax looks exactly like rest syntax, but is used for the opposite purpose."翻译过来:看着一样,干的事相反,小心别翻车。

展开运算符:把箱子里的东西倒出来

展开运算符的核心动作是"展开"(expand)。想象你有个数组`[1, 2, 3]`,前面加三个点,它就在原地"炸开"成三个独立值。

实际场景最常见的是数组合并与对象拷贝。旧时代合并数组用`concat`,写起来像`arr1.concat(arr2).concat(arr3)`,链式调用一长串。展开运算符让这行代码变成`[...arr1, ...arr2, ...arr3]`,视觉上直接对应"把三个箱子倒进一个新箱子"。

对象场景更有意思。React社区流行一种写法:`const nextState = { ...prevState, count: prevState.count + 1 }`。这里展开运算符做两件事:先拷贝`prevState`的所有属性,再覆盖`count`。Immutable更新模式因此普及, Redux的 reducer 写法被重新定义。

但有个坑很多人踩过:展开只做浅拷贝。`const newObj = { ...oldObj }`如果`oldObj`里有嵌套对象,新对象里的引用指向同一块内存。改`newObj.nested.value`,`oldObj`跟着变。这不是bug,是设计如此——深拷贝的成本JavaScript不想替你承担。

剩余运算符:把散落的东西收进箱子

剩余运算符的行为是"收集"(collect)。它出现在解构赋值或函数参数里,把多个值打包成一个数组。

函数参数是最典型的战场。ES6之前,实现"求任意个数数字之和"需要操作`arguments`。现在写成`function sum(...nums)`,`nums`直接就是正规数组,能`.reduce`、能`.forEach`,类型干净。

解构场景更隐蔽但威力更大。`const [first, ...rest] = [10, 20, 30, 40]`这行代码,在Python里叫"解构",在Rust里叫"模式匹配",JavaScript用剩余运算符实现了同等表达能力。`first`拿到10,`rest`拿到`[20, 30, 40]`,命名即文档。

一个细节:剩余运算符必须是解构的最后一个元素。`const [...middle, last] = arr`会抛语法错误——收集操作只能发生在"尾巴",这是解析器的硬性限制。

为什么社区教学花了三年才统一

2015-2018年间,中文技术社区对这两个概念的翻译混乱不堪。有人叫"扩展运算符/剩余参数",有人叫"展开操作符/rest参数",还有教材直接写"三点运算符"一笔带过。初学者搜到的博客互相矛盾,Stack Overflow的中文镜像站充斥着"为什么我的...报错"的提问。

转折点出现在2018年前后。"拆包vs打包"的类比从英文社区`unpack vs pack`翻译过来,配合图示传播,认知效率陡增。这个类比的优势在于动作可视化:展开是向外发散,剩余是向内收敛,方向感明确。

但类比也有边界。展开运算符在函数调用场景还有一招:`fn(...args)`相当于`fn.apply(null, args)`,把数组"展开"成参数列表。这是剩余运算符的逆操作——一个收集,一个发散,在调用栈的两端对称存在。

现代框架进一步放大了这两个符号的使用密度。Vue 3的响应式系统用展开做对象合并,React Hooks用剩余参数实现自定义Hook的参数透传,Next.js的路由API用剩余运算符捕获动态路由段。不会这两个符号,读源码像看天书。

检验理解的最快方式:看一段代码能否瞬间判断`...`在干什么。

比如`const { a, ...rest } = obj`——这是剩余,收集`a`之外的属性。`const newObj = { ...obj, b: 2 }`——这是展开,拷贝`obj`再添加`b`。`function fn(...args)`——剩余,收参数。`fn(...args)`——展开,传参数。位置决定行为,语法上下文是唯一判据。

2024年State of JS调查显示,94%的开发者日常使用ES6+特性,但关于`...`的细微行为仍有32%的受访者承认"偶尔需要查文档确认"。这个比例在入行三年内的开发者中飙升到51%。

语言设计的简洁性有时候是幻觉。三个点省下了`concat`、`slice`、`apply`的字符,但把认知负担转移到了"上下文判断"上。TC39委员会当年是否预见到这个教学难题?ES6规范编辑Allen Wirfs-Brock在回忆录里提过:"我们选择了符号经济性,代价是文档工程师的额外工作。"

现在打开你的代码库,搜一下`...`出现的次数。如果超过50处,有多少是你写的时候完全确定行为、不需要停顿思考的?那个停顿的瞬间,就是JavaScript设计哲学在你脑中的显形。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
11万里程换来的大牌护肤品是假货,南航客服要求消费者先删贴

11万里程换来的大牌护肤品是假货,南航客服要求消费者先删贴

DoNews
2026-04-09 14:09:33
从深圳城中村到年销800亿!大疆创始人汪滔时隔10年再次发声:回顾20年创业之路

从深圳城中村到年销800亿!大疆创始人汪滔时隔10年再次发声:回顾20年创业之路

快科技
2026-04-09 16:05:05
马筱梅晒满月儿子汪宝儿,简直生了个迷你自己,软萌福相太圈粉!

马筱梅晒满月儿子汪宝儿,简直生了个迷你自己,软萌福相太圈粉!

可爱小菜
2026-04-10 10:50:55
张兰心寒后,马筱梅怒了,不回北京原因曝光,走了小杨阿姨的老路

张兰心寒后,马筱梅怒了,不回北京原因曝光,走了小杨阿姨的老路

萧狡科普解说
2026-04-10 05:07:00
演玉芬爆红却隐婚!老公是于洋,被宠成宝太羡慕了!

演玉芬爆红却隐婚!老公是于洋,被宠成宝太羡慕了!

可乐谈情感
2026-04-10 01:03:26
为什么我总是性欲旺盛——性幻想的解释

为什么我总是性欲旺盛——性幻想的解释

心理咨询师陈实
2026-04-09 22:00:03
李宗仁晚年吐露,红军长征取得胜利,全靠老蒋这步神助攻

李宗仁晚年吐露,红军长征取得胜利,全靠老蒋这步神助攻

晓张说
2026-04-09 17:25:40
张雪终于把碎屏手机换了!用上荣耀折叠屏手机 竖大拇指:好轻啊

张雪终于把碎屏手机换了!用上荣耀折叠屏手机 竖大拇指:好轻啊

念洲
2026-04-10 08:41:40
大陆高规格接待郑丽文,让岛内见识到了大陆的智慧,郑丽文的强硬

大陆高规格接待郑丽文,让岛内见识到了大陆的智慧,郑丽文的强硬

袁周院长
2026-04-09 17:25:58
《妻子浪漫旅行》最尴尬的夫妻,话少还装甜蜜,没李纯马頔自然

《妻子浪漫旅行》最尴尬的夫妻,话少还装甜蜜,没李纯马頔自然

一娱三分地
2026-04-09 19:22:11
员工曝真相!迟重瑞与陈丽华真实相处:对外是迟总,对内是迟叔

员工曝真相!迟重瑞与陈丽华真实相处:对外是迟总,对内是迟叔

情感大头说说
2026-04-10 12:21:06
1996年,何道泉中将给邓公写信承认错误,之后被调到国防大学任职

1996年,何道泉中将给邓公写信承认错误,之后被调到国防大学任职

我不是沃神
2026-04-10 09:45:03
妮可·基德曼顶3斤假发亮相,Schiaparelli高定秒变淘宝

妮可·基德曼顶3斤假发亮相,Schiaparelli高定秒变淘宝

热搜摘要官
2026-04-10 08:02:47
8岁男孩因压力过大,跟妈妈说"想睡一会",但是却再也没有醒来

8岁男孩因压力过大,跟妈妈说"想睡一会",但是却再也没有醒来

大果小果妈妈
2026-03-15 17:14:30
太秀了,我把自己蒸馏成了 Skill!已开源

太秀了,我把自己蒸馏成了 Skill!已开源

程序员鱼皮
2026-04-09 18:48:42
婆婆没有边界感是一种什么体验?网友:问你们要不要纸

婆婆没有边界感是一种什么体验?网友:问你们要不要纸

夜深爱杂谈
2026-03-21 20:44:32
中国超算中心遭窃10PB数据:6000家机构卷入

中国超算中心遭窃10PB数据:6000家机构卷入

全栈遛狗员
2026-04-09 17:50:54
韦伯望远镜一张照片,让全世界天文学家集体沉默:理论错了?

韦伯望远镜一张照片,让全世界天文学家集体沉默:理论错了?

观察宇宙
2026-04-09 19:01:44
两个杜兰特一队怎么打?探花近4战场均20+6,火箭1.2亿签约太超值

两个杜兰特一队怎么打?探花近4战场均20+6,火箭1.2亿签约太超值

你的篮球频道
2026-04-10 11:15:39
王楚钦母亲任伟:吉林大学校花,创业虎妈,如今53岁依然好美

王楚钦母亲任伟:吉林大学校花,创业虎妈,如今53岁依然好美

庭小娱
2026-04-10 10:36:54
2026-04-10 13:23:00
字节漫游指南
字节漫游指南
有态度网友ytd
1395文章数 16关注度
往期回顾 全部

科技要闻

程序员惊喜,每月100美元!OpenAI推新套餐

头条要闻

再次"一肩挑"的苏林 将中国作为出访的首个国家

头条要闻

再次"一肩挑"的苏林 将中国作为出访的首个国家

体育要闻

17岁赚了一百万美元,25岁被CBA裁员

娱乐要闻

夏克立婚内出轨 曾参加《爸爸去哪儿》

财经要闻

爱尔眼科一院长被指猥亵 总部:已被停职

汽车要闻

全新一代理想 L8 五座旗舰+5C增程系统 三季度交付

态度原创

教育
数码
旅游
健康
公开课

教育要闻

公共俄语四级词汇与语法技巧,仅3招拿下20分!

数码要闻

2026年第一季度全球PC出货量增长3% 联想份额破25%

旅游要闻

上观福利|春染大别山,赴约来六安,这里有一封来自春天的邀请

干细胞抗衰4大误区,90%的人都中招

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版