根据ECMAScript 5.1 标准的11.4.8小节:
产生式 UnaryExpression : ~ UnaryExpression的评估如下:
- 让
expr
是评估UnaryExpression的结果。- 让。
oldValue
_ToInt32(GetValue(expr))
- 返回对 应用按位补码的结果
oldValue
。结果是一个有符号的 32 位整数。
操作员将~
调用内部方法ToInt32
。在我的理解中ToInt32(1)
,并且ToInt32(-1)
会返回相同的值 1 ,但是为什么~-1
等于 0 和~1
等于 -2 呢?
现在我的问题是为什么ToInt32(-1)
等于-1?ECMAScript 5.1 标准的第9.5小节:
抽象操作 ToInt32 将其参数转换为-2 31到 2 31 -1范围内的 2 32 个整数值之一,包括端点。这个抽象操作的作用如下:
- 令 number 为对输入参数调用 ToNumber 的结果。
- 如果 number 为 NaN、+0、-0、+∞ 或 -∞,则返回 +0。
- 让 posInt 为 sign(number) * floor(abs(number))。
- 令 int32bit 为 posInt 模 2 32;也就是说,具有正号且幅度小于 2 32的 Number 类型的有限整数值 k使得 posInt 和 k 的数学差在数学上是 2 32的整数倍。
- 如果 int32bit 大于等于 2 31,则返回 int32bit − 2 32,否则返回 int32bit 。
当参数为 -1 时,根据 9.5,在第 1 步中编号仍为 -1,在第 3 步中跳过第 2 步 posInt 在第 4 步中为 -1 int32bit 在第 5 步中为 1 它将返回 1
哪一步错了?