今天写单测的时候遇到一个问题,是关于??的优先级问题,在这里记录一下。
要测试的代码:
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);
};