您的位置:首页 > 教育 > 锐评 > 海外网络推广外包_东莞seo推广_网络营销建议_智能建站

海外网络推广外包_东莞seo推广_网络营销建议_智能建站

2025/4/2 14:32:06 来源:https://blog.csdn.net/liangshanbo1215/article/details/146904550  浏览:    关键词:海外网络推广外包_东莞seo推广_网络营销建议_智能建站
海外网络推广外包_东莞seo推广_网络营销建议_智能建站

今天写单测的时候遇到一个问题,是关于??的优先级问题,在这里记录一下。

要测试的代码:

export const getCloudTotal = (record: Org) => {const { Version = {} } = record;return Version['1'] ?? 0 + Version['2'] ?? 0;
};

单元测试代码:

describe('cloud total functions', () => {const mockRecord = {Version: {'1': 10,'2': 20}};it('should calculate total cloud', () => {expect(getCloudTotal(mockRecord)).toBe(30);});
});

单元测试报错:

为什么返回的不是30而是10呢?

在 JavaScript 中,??空值合并运算符,它的优先级低于大多数运算符(包括加法 +),但高于逻辑运算符(如 ||&&)。因此,在表达式中需要特别注意运算符的优先级问题。

Version1 ?? 0 + Version2 ?? 0
1. 运算符优先级:

根据 JavaScript 的运算符优先级规则:

  • 加法运算符 + 的优先级高于 ??
  • 因此,表达式会被解析为:
Version1 ?? (0 + Version2) ?? 0
2. 分步计算:
  • Version1 = 10,它既不是 null 也不是 undefined,所以 (Version1 ?? ...) 的结果是 10
  • 因为 Version1 已经是非空值,后续的 (0 + Version2) 和 ?? 0 都不会被执行。
3. 最终结果:

整个表达式的值就是 10

4、正确代码:
export const getCloudTotal = (record: Org) => {const { Version = {} } = record;return (Version['1'] ?? 0) + (Version['2'] ?? 0);
};

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com