.toString()
旨在返回字符串表示中数字的符号。参见EcmaScript 2015,第 7.1.12.1 节:
- 如果m小于零,则返回字符串“-”和 ToString(- 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)
.