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

Why "~undefined" is -1 in JavaScript?

根据这个post,运行下面的代码

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

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

对于 ~ 运算符,"undefined, NaN" 在 JS 中无法用位表示的所有事物都被视为 00000000000000b,因为它将操作数转换为一个带符号的整数 请参阅@felixkling answer 以获取更多详细信息,并且由于操作 ~ 是 BITwise not 或 1s complement 翻转位所以语句结果 111111111111b 作为 1 的序列,当处理二进制级别的数字时,MSB(最高有效位)被视为 sign 因此在将所有 0s 转换为 1s 时例如,它会导致 -1 的十进制值尝试 ~0。并使用此代码获取数字 (-3 >>> 0).toString(2))

的二进制表示

显然undefined的位表示都是0。这可以通过以下方式看出:undefined | 0 的计算结果为 0。因此我们知道 undefined 的位表示全为零。

如果我们现在过滤所有位(这正是 ~ 所做的),我们将得到所有 1s,这是 -1.

的表示

这一切之所以有效,是因为 javascript 的类型一致性

~ is bitwise NOT. It uses ToInt32 将参数转换为数字。 ToInt32 定义为:

  1. Let number be ToNumber(argument).
  2. ReturnIfAbrupt(number).
  3. If number is NaN, +0, −0, +∞, or −∞, return +0.
    ...

反过来,ToNumber(undefined)returnsNaN,所以根据第3步,ToInt32returns0.

~0-1