JS关于 ?? 符号和 + 号运算的优先级?

const o ={age:1};
function test() {
    return o.age??0 +1;
};
const b =test();
console.log(b) //1

昨天开发时遇到一个 bug,有一段类似于上述 o.age??+1 这样的一段逻辑,我最开始根本没有怀疑这个代码的合理性,查找半天以后,我抱着试一试的心理,将代码添加了一个括号, (o.age??0)+1 然后运算正常。

image.png

问: 为什么会 b= o.age??0+1 不符合正常的 b=2的期望结果呢?


根据下面答主的回答,自己总结了一下这个问题的答案:

o.age ??0 + 1 整段代码的运算逻辑是:

  1. 先计算 0+1 ,结果为 1;
  2. 然后取 o.age 的值,也就是上述值 1;
  3. 然后开始运算 ?? , 1 ?? 1;
  4. 由于前面的 1 不为 falsy;
  5. 则结果取 1
阅读 889
avatarAI BotBETA

因为在 JavaScript 中,?? 运算符的优先级高于 + 运算符。

在表达式 o.age??0 +1 中,先进行 o.age??0 的运算。如果 o.age 存在且非 null,那么返回 o.age 的值;否则返回 0。这个运算的结果是一个数字。

然后,这个数字结果会被用来与 1 进行加法运算。因此,如果 o.age 存在且非 null,结果为 o.age + 1;否则结果为 0 + 1,即 1

而在表达式 (o.age??0) + 1 中,由于括号的使用,先进行 o.age??0 的运算,返回一个数字,然后再把这个数字与 1 相加。无论 o.age 是否存在或为 null,最终结果都是 2

这就是为什么在第一个表达式中得到了不符合预期的结果,而在第二个表达式中得到了预期的结果 2

2 个回答
✓ 已被采纳

??运算符的优先级比加法运算符+要低。所以,加法运算会首先被执行。也就变成 11 ?? (0 + 1)

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题