为什么JavaScript中+0n会抛出错误而-0n可以正常运行?
问题原因分析
核心差异是两个表达式调用的运算符规则完全不同
- 首先看会报错的
console.log(String(+0n)):
这里的+0n不是一个整体BigInt字面量,本质是对BigInt字面量0n应用一元加号运算符+。ECMAScript规范明确禁止一元加号运算符作用于BigInt类型的操作数,因为一元加号的默认行为是将操作数转换为Number类型,而BigInt和Number之间的隐式转换存在精度丢失的风险,所以不管操作数是0n还是其他任意BigInt值,只要用一元加号作用都会抛出TypeError,和值本身无关。 - 再看可以正常执行的
console.log(String(-0n)):
这里的-是一元负号运算符,ECMAScript规范明确允许一元负号作用于BigInt类型,作用是返回该BigInt的负值。-0n会先计算得到合法的BigInt类型负零值,再传入String()方法做类型转换自然可以正常运行,最终输出结果为"0"。
内容的提问来源于stack exchange,提问作者Amir
相关产品推荐
相关产品推荐

