likes
comments
collection
share

为什么是 void 0 而不是 void 9?

作者站长头像
站长
· 阅读数 13

Halo Word!大家好,我是大家的林语冰(挨踢版)~

今天我们来伪科普一下下——关于我们为何使用 void 操作符这档事。


敏感话题(省流版)

  1. 为什么要用 void 0 替换 undefined
  2. 我们为什么需要 void 操作符?
  3. 你可能大概也许不需要 void 操作符

1. 为什么要用 void 0 替换 undefined

请想象眼前一位虚拟面试官,祂开始灵魂拷问,为什么要用 void 0 替换 undefined

我们的第一反应可能是从 undefined 的历史包袱展开如数家珍。因为 undefined 不是字面量,所以“魔术变量”undefined 并不恒等于 undefined 原始值,void 0 永远返回安全的 undefined 原始值刚好可以规避这一挨踢负债。

这个答题思路问题不大,最大的问题在于趋同和省流,缺少闪光点。

前端已死莫衷一是,前端已卷俯拾皆是,私以为 9 个前端可能就有 9 个能接近甚至超越这个答题水平,这绝对不是危言耸听,不信大家有空可以瞄一眼评论区,就会看到巨大的、无形的内卷,比猫猫的睡姿还卷。

为什么是 void 0 而不是 void 9?

如果我们要尝试凡尔赛地对其他面试者降维打击,不烦在此基础上精益求精。除了吐槽 undefined 的不足,不烦“墙裂推荐” void 的不凡。

这就有点意思了,说来忏愧,语冰关于 void 的第一印象,就是没有印象。事实上,语冰的潜意识常常会选择性忽略源码中的 void,就好像大家常常会忽略彼芯一样,void 的存在感简直和语冰平分秋色。

如果让语冰选三个词来形容 void,那大约会是鸡肋、小众、存在感低下,但求生欲极强。

地球人都知道,void 是一个“一元操作符”,void 是一个“常量操作符”,void 是一个“幂等操作符”。(由于 void 存在感实在太低,语冰不得不使用排比修辞来致敬高考。弹幕请走一波“爷青回”。)

地球人都知道但你不知道,不要在意这些细节,我们一起当喵星人就好了。

你知道的,void 0 是一个一元表达式,由两部分组成——

  • void 操作符
  • 0 操作数(表达式)

一元操作符 AKA“单目操作符”,指的是该操作符有且仅有一个操作数,相信大家也早就见怪不怪了。

虽然但是,不知道大家有没有想过——为什么是这个唯一的操作数通常是 0?

举个粒子,我也很好啊,比如 void '米娜桑の林语冰'

为什么是 void 0 而不是 void 9?

前端伪科普

所谓 KISS 原则是“Keep It Simple & Stupid”的首字母缩写,不是贴贴/啵啵的那个 kiss,代码推崇简单粗暴浅显易懂的傻瓜式编程,追求大道至简,大智若愚的编程风格。

举个粒子,乔布斯“墙裂推荐”iPod 的 8G 容量时,并没有抽象地去科普 8G 容量有多大,他只说了一句平平无奇但却让人醍醐灌顶的话:you guys 可以把 1000 首歌装进口袋里。

为什么是 void 0 而不是 void 9?

猫眼可见,操作数好像只是一个占位符,功能完全“图灵等价”,为什么偏偏非零不可?我不能接受,语冰更偏爱自己的生命灵数。

要知道罗马数字甚至没有 0,那罗马人怎么写代码?哦对,祂们写 JS 是用英语,那没事了。

我再重生一遍,我没有在开玩笑,为什么开源项目的集体潜意识像是植入了“思想钢印”,不约而同地偏爱 void 0?语冰强迫症晚期,今天找不出 void 0 的流量密码,那大家都别睡了!!!

原因其实很简单,因为“潜规则”。薛定谔曾经说过,按照惯例我们用 void 0 来获得 undefined(这主要源自 C 语言)。

换而言之,C 语言是大多数现代编程语言的前辈,一些编程风格也难免潜移默化地影响了后来其他编程语言的设计和使用,就好像语冰的这个视频一样影响了大家。

void 0 只是在致敬 C 语言的传统罢了,优雅得不谈。大家不烦也用一键三连来 respect 一下这个视频。(Anyway,流量密码找到了,大家可以洗洗睡了~)

BTW,JS 是一门混合范式的语言,语冰的合集叫《ES6 混合理论》也有 9% 是这个原因,(另外的 99% 当然是因为 LinkinPark 啦~)

JS 致敬其他语言还有好多好多粒子。举个粒子,包括但不限于语法设计、代码风格、编程实践等——

  • 类名首字母大写???
  • 私有属性下划线开头???
  • && 操作符短路返回值不是布尔值???
  • 其他三连可观看内容???

倘若你不知道 Why,记得偷偷来看语冰的视频,千万不要面试时再去问面试官 Why,不然就暴露了你的水平,显得很业余,到时候工资也要小写了,内卷比较激烈指不定你的简历也要被下划线划掉了,职业生涯出师未捷先短路。

反而言之,如果面试时恰好谈到 undefined,不烦凡尔赛地如数家珍,浅谈一下下 void 0 和 C 语言的恩怨情仇,给面试官一种你很专业的错觉,更加顺利地 sell yourself(畅销自己)。

你知道的,void 操作符不仅有且仅有一个操作数,而且有且仅有一个返回值——即 undefined 原始值。虽然但是,void 有时好像不返回 undefined

举个粒子,void 操作符不返回 undefined 的错觉。

为什么是 void 0 而不是 void 9?

猫眼可见,这是我们使用操作符的常见错误。语冰上一次犯错,还是在上一次。你知道的,这其实不是 void 操作符的 BUG,而是操作符的优先级问题。

举个粒子,我们可以通过 () 操作符分组,重新定义优先级。

为什么是 void 0 而不是 void 9?

猫眼可见,void 操作符确实能且仅能返回 undefined 原始值。

换而言之,void 不仅是一个平平无奇的一元操作符,还是一个平平无奇的“常量操作符”。

大家可能没有听过这个奇葩的说法,我摊牌了,这是我编的。

原因很简单,如果面试时大家背的都是同质化内容,面试官肯定容易犯困,尤其群面时越晚发言的面试者劣势越大,往往最后一个面试者只能怨天尤人,竟无语凝噎。

毋庸置疑,面试官肯定青睐那个性价比与颜值并重,关键还喜欢铲屎的。所以面试时,除了凡尔赛的细节,还要安排一点绝活——个性化的口技,这些都是加分的闪光点。

我们不烦指猫为狗,用函数的方式打开 void 操作符。事实上,void 0void(0) 功能上完全“图灵等价”,void(0) 看起来就像一个 void() 函数,写做 void() 函数,读做 void 操作符。

举个粒子,我们不烦用 ES6 简单模拟一下 void 操作符的算法。

为什么是 void 0 而不是 void 9?

猫眼可见,_void() 函数的特点是有且仅有一个返回值——即 undefined 原始值。

这里语冰偷偷分享一个小众的冷知识,这种返回值恒定的函数被称为“常量函数”。

百度百科曾经说过,不论自变量如何变化,对应的函数值都始终保持不变的函数,称为常量函数。(适用领域:数学/计算机)

举一反一,void 操作符是一个“常量操作符”。

前端高能

这是独属于林语冰的前端口技。你知道的,多巴胺源于惊喜。如果你能如数家珍,可以安排这种小惊喜让面试官产生前端多巴胺。如果你不喜欢或不理解这个观点,建议避而不谈,不要给自己挖坑,试试就逝世。

你知道的,void 不仅是一个见怪不怪的一元操作符,还是一个见怪不怪的“常量操作符”,更是一个见怪不怪的“幂等操作符”。

看到这个引号相信机智如你已经懂了,是的没错,又是我编的,凡尔赛一时爽,一直凡一直爽。

这里语冰偷偷分享一个小众的冷知识——“幂等”。百度百科曾经说过,幂等(idempotent)是一个数学与计算机学概念,常见于抽象代数中。在编程中一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。

先不谈抽象代数,百度百科的解释就很抽象。就我个人而言,看到又臭又长的概念我就头大脑壳疼,说白了就是有点类似简单但奇葩的算术运算,举个粒子,包括但不限于:

  • 加法运算的幂等加零操作,“x + 0 + 0 + ... + 0”,结果还是等于 x
  • 减法运算的幂等减龄操作,“x - 0 - 0 -...- 0”,结果还是等于 x
  • 乘法运算的幂等乘一操作,“x * 1 * 1 *...* 1”,结果还是等于 x
  • 举一反一,除以一结果应该等于 ???
  • 其他三连可观看内容......

为什么是 void 0 而不是 void 9?

猫眼可见,私以为所谓的“幂等操作”简单理解“挖呀挖呀挖”,但是挖一次和挖亿次的结果一猫一样——都没有搞到比特币。

作为一个彻头彻尾的数学笨蛋,语冰看到什么数学/代数啊之类的术语就 PTSD 血压增高两眼发晕头皮发麻,反正上述概念你能读懂那是你的超能力,请好好珍惜。

语冰不擅长从抽象代数的角度来给大家讲解,所以只能勉为其难地从计算机科学的角度来伪科普一下下。倘若你和我一样有“晕学症”(“学”特指“数学”),那不烦一起来瞄一眼代码 demo。

举个粒子,“顾名失忆”,幂等的意思就是无论我们用 void 操作符运算几次,其结果都和只用 void 操作符运算一次的结果一猫一样。

为什么是 void 0 而不是 void 9?

猫眼可见,不管你是一键三连,一键五杀,还是一瞬千击,void 永远对 undefined 一心一意,就像语冰作为地球猫猫教的虔信徒,也对猫猫一心一意,日久生情的理论在 void 这里显然是行不通的,但是彼芯在语冰这里效果拔群。

为什么是 void 0 而不是 void 9?

举一反一,幂等这个形容词也可以用来修饰其他函数/方法/API 之类的,恰当使用可以作为面试加分的凡尔赛小技巧,一时幂等一时爽,一直幂等一直爽。

语冰再偷偷分享几个脑洞急转弯,感兴趣的前端爱好者可以虚拟面试一下下列操作是否具备幂等性,包括但不限于:

  • = 赋值操作符???
  • + 操作符???
  • Number() 函数???
  • HTTP 方法(GET/POST 等)???
  • 其他三连可观看内容......

BTW,幂等思维显然不适合学习方法或面试大法,我们学习的时候要警惕这种思维。

比如我一天敲了 999 行代码,但是祂们是幂等的 console.log('一键三连'),这种机械式增值肯定肝不过 CatCAT。或者面试时你的技术瓶颈和别人是幂等的,面试官问的问题你的回答都和别的小伙伴一猫一样,那就很难掌握主动权,毋庸置疑,面试官青睐那个性价比与颜值并重,关键还喜欢铲屎的。

综上所述,语冰的个人心证是,如果面试时要 pick 三个关键词来让 void 操作符凡尔赛,不烦试试一元操作符/“常量操作符”/“幂等操作符”。

免责声明

语冰偷偷给大家伪科普一些离题万里的编程术语,不是为了让大家挨踢蕉绿/逐渐忘记标题,而是通过产生前端多巴胺让大家不幂等,听懂抠 9。


我们为什么需要 void 操作符?

讲真的,就我个人而言,私以为 void 操作符是个存在感低下的操作符,语冰刚入门 ES6 时甚至不知道还有这么一个鸡肋的操作符,但有时祂偏偏又是不可或缺的。

JS 为什么要集成 void 操作符呢?难道就为了用 void 0 致敬 C 语言?据我所知,“JS 之父”好像并不是 C 语言的迷弟,所以这个推理显然和 void 操作符一样鸡肋。

我再重生一遍,我没有在开玩笑,void 操作符的刚需是什么?语冰强迫症晚期,今天找不出 void 0 的设计动机,那大家都别睡了!!!

薛定谔曾经说过,集成 void 操作符是为了打辅助,以便定义那些会在单击时执行 JS 代码的 HTML 超链接。

为什么是 void 0 而不是 void 9?

猫眼可见,javascript: 一种是浏览器可识别的特殊 URL 协议,点击时祂会执行其中的 JS 代码,用执行的返回值替换页面内容,除非返回 undefined

换而言之,有些场景下 void 操作符确实是不可或缺的,只是我们很少注意。void 操作符不仅服务于 ECMAScript,也服务于“JS 伪协议”等。


你可能大概也许不需要 void 操作符

你知道的,主流的代码风格对 void 的限制:

  • 要么是“禁欲系”,能且仅能节制地使用
  • 要么是“绝育系”,纸上得来终觉浅,使用 void 要宫刑
  • 要么是“纵欲系”,直接放飞自我野蛮生长,主打就是一个 freestyle,爱咋滴咋滴

地球人都知道,void 0 是读取 undefined 原始值的最佳实践。虽然但是,有时因为一些不可抗力,比如公司的代码风格禁用 void 操作符,那该如何是好?这里语冰偷偷分享几个“图灵等价”的黑科技。

举个粒子,其他生成安全 undefined 的“黑科技”,未必是最佳实践,但是有备无患,仅供参考。

为什么是 void 0 而不是 void 9?

BTW,关于前端分号这档事,前端生态里分裂出的著名宗教包括但不限于“分号教”和“无分号教”,这取决于你的公司的代码风格/你自己的代码洁癖写不写分号。

这里语冰偷偷分享一个小众的冷知识,void 操作符有时可以用作分号的替代品。

为什么是 void 0 而不是 void 9?

这里语冰又双叒叕偷偷分享一个小众的冷知识,void 操作符有时可以用来强制表达式执行。

为什么是 void 0 而不是 void 9?

BTW,还有一些场景你可能需要使用 void 操作符显式丢弃函数的返回值,但常常被我们顶风作案视而不见,有时候就会造成看不见的 BUG。

Anyway,语冰的个人心证是,大多数情况下,你可能大概也许不需要 void 操作符,但是未雨绸缪值得彼芯。


免责声明

本文示例代码默认均为 ESM(ECMAScript Module)筑基测评,因为现代化前端开发相对推荐集成 ESM,其他开发环境下的示例会额外注释说明,edge cases 的解释权归大家所有。

今天的《ES6 混合理论》就讲到这里啦,我们将在本合集中深度学习若干奇奇怪怪的前端面试题/冷知识,感兴趣的前端爱好者可以关注订阅,也欢迎大家自由言论和留言许愿,共享 BUG,共同内卷。

吾乃前端的虔信徒,传播 BUG 的福音。

我是大家的林语冰,我们一期一会,不散不见,掰掰~