为什么“~undefined”在 JavaScript 中是 -1?
Why "~undefined" is -1 in JavaScript?
根据这个post,运行下面的代码
> ~function () { console.log('foo');}()
foo
-1
众所周知,上述匿名函数的return值为undefined
。 为什么 ~undefined
是 -1
?我找不到任何类似的问题。
对于 ~
运算符,"undefined, NaN" 在 JS 中无法用位表示的所有事物都被视为 0
或 0000000000000b
,因为它将操作数转换为一个带符号的整数 请参阅@felixkling answer 以获取更多详细信息,并且由于操作 ~
是 BITwise not 或 1s complement 翻转位所以语句结果 111111111111b
作为 1
的序列,当处理二进制级别的数字时,MSB(最高有效位)被视为 sign
因此在将所有 0s
转换为 1s
时例如,它会导致 -1
的十进制值尝试 ~0
。并使用此代码获取数字 (-3 >>> 0).toString(2))
的二进制表示
显然undefined
的位表示都是0
。这可以通过以下方式看出:undefined | 0
的计算结果为 0
。因此我们知道 undefined
的位表示全为零。
如果我们现在过滤所有位(这正是 ~
所做的),我们将得到所有 1
s,这是 -1
.
的表示
这一切之所以有效,是因为 javascript 的类型一致性
~
is bitwise NOT. It uses ToInt32
将参数转换为数字。 ToInt32
定义为:
- Let number be ToNumber(argument).
- ReturnIfAbrupt(number).
- If number is NaN, +0, −0, +∞, or −∞, return +0.
...
反过来,ToNumber(undefined)
returnsNaN
,所以根据第3步,ToInt32
returns0
.
而~0
是-1
。
根据这个post,运行下面的代码
> ~function () { console.log('foo');}()
foo
-1
众所周知,上述匿名函数的return值为undefined
。 为什么 ~undefined
是 -1
?我找不到任何类似的问题。
对于 ~
运算符,"undefined, NaN" 在 JS 中无法用位表示的所有事物都被视为 0
或 0000000000000b
,因为它将操作数转换为一个带符号的整数 请参阅@felixkling answer 以获取更多详细信息,并且由于操作 ~
是 BITwise not 或 1s complement 翻转位所以语句结果 111111111111b
作为 1
的序列,当处理二进制级别的数字时,MSB(最高有效位)被视为 sign
因此在将所有 0s
转换为 1s
时例如,它会导致 -1
的十进制值尝试 ~0
。并使用此代码获取数字 (-3 >>> 0).toString(2))
显然undefined
的位表示都是0
。这可以通过以下方式看出:undefined | 0
的计算结果为 0
。因此我们知道 undefined
的位表示全为零。
如果我们现在过滤所有位(这正是 ~
所做的),我们将得到所有 1
s,这是 -1
.
这一切之所以有效,是因为 javascript 的类型一致性
~
is bitwise NOT. It uses ToInt32
将参数转换为数字。 ToInt32
定义为:
- Let number be ToNumber(argument).
- ReturnIfAbrupt(number).
- If number is NaN, +0, −0, +∞, or −∞, return +0.
...
反过来,ToNumber(undefined)
returnsNaN
,所以根据第3步,ToInt32
returns0
.
而~0
是-1
。