根据此post,运行以下代码
> ~function () { console.log('foo');}()
foo
-1
众所周知,上述匿名函数的返回值为undefined
。 为什么~undefined
为-1
?我找不到任何类似的问题。
答案 0 :(得分:21)
~
is bitwise NOT。它使用ToInt32
将参数转换为数字。 ToInt32
定义为:
- 设数为ToNumber(参数)。
- ReturnIfAbrupt(号码)。
- 如果数字是NaN,+ 0,-0,+∞或-∞,则返回+0 ...
醇>
反过来,ToNumber(undefined)
会返回NaN
,因此根据步骤3,ToInt32
会返回0
。
而~0
是-1
。
答案 1 :(得分:7)
所有无法在JS中用位表示的东西,例如“undefined,NaN”被0
或0000000000000b
处理为~
运算符,因为它将操作数转换为已签名整数请参阅@felixkling回答以获取更多详细信息,因为操作~
是BITwise not或1s补码翻转位,所以语句导致111111111111b
作为序列1
当在二进制级别处理数字时,MSB(最高有效位)被视为sign
,因此在将所有0s
转换为1s
时,会产生十进制值例如,-1
尝试~0
。并使用此代码获取数字(-3 >>> 0).toString(2))
答案 2 :(得分:2)
显然0
的位表示都是undefined | 0
s。如果通过以下方式可以看到:0
,其评估为undefined
。因此,我们知道~
的位表示全部为零。
如果我们现在填充所有位(这正是1
所做的那样),我们得到所有-1
s,它是clients
的表示。
所有这些都是因为javascript的类型cohersion