问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

一个由JS中`?.`可选链运算符引起的有趣bug

发布网友 发布时间:2024-10-09 17:50

我来回答

1个回答

热心网友 时间:2024-10-09 18:36

最近被调去处理一些缺陷,所以时间变得宽裕了一些。

在这个过程中,我遇到了一个有趣的bug,就是文章标题所提到的那个问题。

为了使代码更加直接,我们可以使用babel进行转换。

我已经将相关代码同步到了我的网站Serene Syllables上,喜欢代码高亮的可以前往查看。

接下来,我们将探讨由JS中的`?.`可选链运算符引起的有趣bug。

首先,我们需要了解什么是`.?.`可选链运算符。

具体内容可以参考:Optional chaining (?.) - JavaScript | MDN (mozilla.org)

使用方法很简单,只需在字段前加上`.?.`,这样就不会报错了。

例如,第二个示例中没有使用`.?.`,因此引起了报错。

在许多场景中,这会使代码更加方便,我们不再需要使用`aaa && aaa.b && aaa.b.c`这样的判断。

然后,我们来看看这个运算符的兼容性。

看起来所有浏览器都支持,但实际上只有现代浏览器支持,我们的老朋友IE不支持。

接下来,我们来看看babel相关的polyfill。

之前我写过一篇入门文章,可以了解babel入门学习 - 知乎 (zhihu.com)

实际上,你可能认为既然现代浏览器都支持,并且我使用的框架也只支持现代浏览器,那么我完全不需要处理这个问题。

实际上,如果你的项目中引入了babel并且没有进行特殊配置,那么这个方法就会被polyfill掉,因为`.?.`是ES6引入的运算符。

下面是一个配置示例。

然后运行它,看看结果。

可以看到,被polyfill成ES5可以理解的代码块,和以前我们使用的`a && a.b && a.b.c`这种写法差不多。

好了,前置知识了解完毕,接下来进入主题。

我们直接来看代码。

问题代码是`value?.indexOf("aa") == -1`,这行代码看起来是正常的,没有问题。

然后我们用babel转换成更直接的方式。

`(value === null || value === void 0 ? void 0 : value.indexOf("aa")) == -1`看起来也没问题。

但是,别忘了,这是一个if语句。如果`value`为`undefined`,那么此时`indexOf`不会被执行,而是`void 0`。因此,这个if语句是`false`。

但这里的预期是`''`.indexOf("aa") == -1`也是`true`。那么这个逻辑就有问题了。

这个if语句的判断逻辑因为`.?.`而发生了变化。

处理方案很简单,就是确保这个语句一定会执行。既然`value`是`undefined`,那么我们可以添加一个默认值。

然后我们再来看一下转换出来的代码。

这样就一定可以执行了。

这是一个很有意思的bug。

在if语句中谨慎使用`.?.[method]`(这里的`method`指的是一些用于判断的方法),除非你确定这里不会有`undefined`等。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
环球黑卡里面有钱吗 收留我歌词 让我们相爱歌词 ...只知道前面的歌词是‘我燃烧了翅膀,你却像风一样,那风铃在摇晃,倾听... 酒店集中隔离期后,为啥还要经过研讨才能出 ...我燃烧了翅膀 你却想风一样 那风铃在摇晃 倾听一种悲伤~~~_百度知... 多吃辣椒对皮肤好吗? 集中隔离到期结束流程是什么 关于时间换算的问题... 从1998年到2024年一共经过了多少年? es6 的 import、export 和 commonjs 的 require、exports模块化分析 今天电脑桌面右下角突然出现Windows7 内部版本 7601,此副本不是正版 求... 我是江苏移动EDGE MODEM上网,我能用此设备看电视,(我的设备说明书说支撑... 我想问问能不能把链接网络电视的modem去掉换一个好点的路由器 adslmodem 看网络电视卡,是MODEM,主板,还是什么原因? 在丹东申请的信用卡能到本溪的银行激活吗 企业效益包括哪些 本溪现在有哪些银行 沈阳哪有本溪银行 本溪本钢开资的工资卡是信用卡还是储蓄卡中国银行的卡 本溪都有什么银行 DJ外文女声国际领域舞曲Dj7妹。 什么歌名 7妹有首英文DJ高潮部分是哇卡哇卡。求大神解读。 有一首电音歌曲,开头是加油门的声音,求歌名,经常用到一些DJ音乐... 为什么手机里收到的短信打开后字体都很大,而扣扣和微信字体是正常的... 怎么写贺卡的祝福语 高一英语,如图,这个a为什么要加上? 有人知道这个写的是什么吗?家里的背景墙上纸画的内容,不知道是诗词_百 ... ...乙车的速度比甲车慢20%。甲车完全程需要8小时,乙车完全程需要多少小... 男朋友的妈妈不喜欢我 说我太小了 他也说过跟我在一起很累 怎... 宝宝六个月了,能不能喝梨子和冰糖一起煮的水 去香港旅游的话,在什么都不买的情况,需要带多少人民币和港币?那里的消... 孕妇能喝枇杷叶煮水吗 我的iPhone4s手机在看视频(土豆 优酷 乐视)的时候会突然跳。掉求大神... 【被坑了】刚刚我用优酷看电视剧的时候,我按了一下暂停,然后出来了一... 鼻梁中间发红像痧一样怎么办 泰迪按体型分有哪几种 长城有哪些轿车 诉讼离婚需要多长时间能够离掉 已经下达执行命令,但是我不想执行了,双方何解了,怎么才能撤回去 佳音体检中心佳音简介 佳音体检中心佳音成长 江北 有哪些社区 ...MX 2004中,若要跳转到指定场景的指定帧开始播放可使用什么指令_百度... 在flashmx2004中我放一个按钮,想让这个按钮跳转到本场景中的第一帧... 125后减震怎么改 125后减震怎么调 ...中,___语句的作用是当播放到指向特定的场景和帧时,停止动画的播放... 摩托后减震怎么调 适用于21H2、21H1、20H2的Win10 build 19044.2006累积更新补丁KB