为什么 `+0n` 会抛出错误而 `-0n` 不会?

5

以下javascript代码会抛出错误:

console.log(String(+0n))

但这段代码可以成功运行:

console.log(String(-0n))

为什么在 JavaScript 中使用 +0n 会抛出错误,但使用 -0n 却不会?
2个回答

14

为了不破坏asm.js:

  • 一元+后跟表达式总是一个数字,或者会导致抛出异常。因此,遗憾的是,对于BigInt来说,+需要抛出异常,而不是与Number上的+相对称:否则,以前“类型声明”的asm.js代码现在将是多态的。

Bergi在评论中强调,这是三个选项中最好的一个:

  1. +BigInt -> BigInt:破坏asm.js和任何其他假设“一元加号给出一个数字”的东西;
  2. +BigInt -> Number:与设计决策冲突,禁止Number和BigInt之间的隐式转换;或者
  3. +BigInt -> 错误。

3
准确地说,他们有三个选择:让它返回bigint(这会破坏asm.js和一些开发人员的期望),让它将bigint转换为数字(这与禁止隐式转换的设计不一致),或者抛出异常。 - Bergi

2

+0n 被视为 +(BigInt(0)),因为一元的 + 表示 "转换为整数",而它无法自动执行该操作(出于某些原因)。

console.log(+(BigInt(0)));

-0n 被视为 BigInt(-0),因为负数可以是大整数。

(您需要检查控制台,因为我猜测 StackSnippets 中存在一个错误,防止 BigInt 转换为字符串在 console.log call 中被强制执行)

console.log(BigInt(-0));


1
奇怪的是 Number(BigInt(0)) 没有报错。 - Barmar
2
@Barmar 这是因为 + 被视为隐式转换(不允许),但 Number 函数是将 bigint 转换为数字的唯一方法。 - Bergi
你是不是想说"转换为数字"而不是"转换为整数"? - traktor
3
这个答案的后一半是不正确的:-0n首先创建BigInt 0,然后对其取反(对于0n来说这是无操作),因此如果有什么区别,它更接近于- BigInt(0);但是它从未创建数字0,因此从未执行数字到BigInt的转换;源文本0n直接解析为一个BigInt。 - jmrk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接