.toString()
旨在返回字符串表示中数字的符号。请参阅EcmaScript 2015,第 7.1.12.1 节:
- 如果m小于零,则返回字符串“-”和 ToString(−<em>m) 的字符串连接。
当基数作为参数传递时,此规则没有什么不同,这可以从第 20.1.3.6 节得出结论:
- 使用radixNumber指定的基数返回此 Number 值的字符串表示形式。[...] 该算法应该是 7.1.12.1 中规定的算法的概括。
一旦理解了这一点,令人惊讶的是为什么它对-3 >>> 0
.
但这种行为实际上与 无关.toString(2)
,因为在调用它之前值已经不同:
console.log (-3 >>> 0); // 4294967293
这是>>>
操作员行为方式的结果。
(在撰写本文时)有关mdn的信息并不完全正确,这也无济于事。它说:
所有位运算符的操作数都转换为二进制补码格式的有符号 32 位整数。
但这不适用于所有按位运算符。运算符是规则的>>>
一个例外。从EcmaScript 2015 第 12.5.8.1 节中指定的评估过程可以清楚地看出这一点:
- 令lnum为 ToUint32( lval )。
ToUint32操作有一个步骤,将操作数映射到无符号 32 位范围:
- 让int32bit为int modulo 2 32。
当您将上述模运算(不要与 JavaScript 的运算符混淆%
)应用于示例值 -3 时,您确实会得到 4294967293。
由于 -3 和 4294967293 显然不是同一个数字,因此(-3).toString(2)
与(4294967293).toString(2)
.