为什么JavaScript按位或奇怪地表现?

Pet*_*owe 6 javascript types boolean-logic

在JavaScript中,似乎:

(4294958077 | 0) == -9219
Run Code Online (Sandbox Code Playgroud)

为什么不是4294958077?

它表明存在某种溢出(虽然我理解它的JavaScript数字类型的范围是+/- 9007199254740992,所以这本身就是奇怪的.)

即使它是溢出,肯定

(4294958077 | 0) == 4294958077
Run Code Online (Sandbox Code Playgroud)

应该评价为真 - 但事实并非如此.

请帮忙

ken*_*ytm 5

它与浮点类型或溢出无关.它返回-9219,因为标准要求它,因为所有二进制按位操作都必须使用带符号的 32位整数(ECMA-262§11.10)完成.

生产A:A @ B,其中@是上述产品中的一个按位运算符,评估如下:

  1. lref成为评估A的结果.
  2. lval为GetValue(lref).
  3. rref是评估B的结果.
  4. rval为GetValue(rref).
  5. lnum成为ToInt32(lval).
  6. rnum为ToInt32(rval).
  7. 返回将按位运算符@应用于lnumrnum的结果.结果是带符号的32位整数.

4294958077转换为带符号的32位整数(使用ECMA-262§9.5中的算法)是-9219,而0仍然是0,所以按位 - 或将返回-9219.