根据这篇文章,运行以下代码
> ~function () { console.log('foo');}()
foo
-1
众所周知,上述匿名函数的返回值为undefined
。为什么~undefined
等于-1
?我找不到类似的问题。
> ~function () { console.log('foo');}()
foo
-1
众所周知,上述匿名函数的返回值为undefined
。为什么~undefined
等于-1
?我找不到类似的问题。
~
是按位非操作符。它使用ToNumber
将参数转换为数字。 ToInt32的定义如下:
- 令number等于ToNumber(argument)的结果。
- 如果转换后的number无效,返回undefined。
- 如果number是NaN、+0、-0、+∞或-∞,则返回+0。
...
而ToNumber(undefined)
返回NaN
,所以根据第3步,ToInt32返回0
。
因此,~0
是-1
。
ToInt32
的链接吗?(我并不是在质疑您的答案,只是好奇而已。) - HoltToInt32
的定义了。你需要 NOT 运算符规范的链接吗? - Felix KlingNOT
运算符的标准链接(甚至引用)可能是一个好主意。 - Holtdeveloper.mozilla.org
上的引用有点暧昧,但标准明确指向 ToInt32
。 - Holt~
时会被视为0
或者0000000000000b
,因为它将操作数转换为带符号的整数。这个操作是按位非(1的补码),会翻转位,所以该语句结果为111111111111b
,即一长串1
。当使用二进制数字时,最高位(MSB)被视为符号
。因此,将所有的0
转换为1
后,结果为-1
,例如尝试执行~0
。要获取数字的二进制表示,请使用以下代码:(-3 >>> 0).toString(2)
。详见@felixkling的回答。undefined
的位表示全部为0
。可以通过以下方式看到这一点:undefined | 0
,其结果为0
。因此,我们知道undefined
的位表示都是零。~
所做的),我们得到所有的1
,即-1
的表示。
~
)的作用,这里有答案。 - Uwe Keim