为什么" ~undefined"在JavaScript中是-1?

时间:2015-12-18 07:30:05

标签: javascript undefined

根据此post,运行以下代码

> ~function () { console.log('foo');}()
  foo
  -1

众所周知,上述匿名函数的返回值为undefined为什么~undefined-1 ?我找不到任何类似的问题。

3 个答案:

答案 0 :(得分:21)

~ is bitwise NOT。它使用ToInt32将参数转换为数字。 ToInt32定义为:

  
      
  1. 设数为ToNumber(参数)。
  2.   
  3. ReturnIfAbrupt(号码)。
  4.   
  5. 如果数字是NaN,+ 0,-0,+∞或-∞,则返回+0   ...
  6.   

反过来,ToNumber(undefined)会返回NaN,因此根据步骤3,ToInt32会返回0

~0-1

答案 1 :(得分:7)

所有无法在JS中用位表示的东西,例如“undefined,NaN”被00000000000000b处理为~运算符,因为它将操作数转换为已签名整数请参阅@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