为什么~“未定义”;是JavaScript中的-1吗?
根据此信息,运行以下代码为什么~“未定义”;是JavaScript中的-1吗?,javascript,undefined,Javascript,Undefined,根据此信息,运行以下代码 > ~function () { console.log('foo');}() foo -1 众所周知,上述匿名函数的返回值是undefined为什么~未定义的是-1?我找不到任何类似的问题。所有在JS中不能用位表示的东西,例如“未定义,NaN”对于~运算符,被视为0或0000000000000 b,因为它将操作数转换为有符号整数请参阅@felixkling answer了解更多详细信息,并且因为操作~是按位not或1s补码,它翻转位,因此语句产生111
> ~function () { console.log('foo');}()
foo
-1
众所周知,上述匿名函数的返回值是
undefined
为什么~未定义的是-1
?我找不到任何类似的问题。所有在JS中不能用位表示的东西,例如“未定义,NaN”对于~
运算符,被视为0
或0000000000000 b
,因为它将操作数转换为有符号整数请参阅@felixkling answer了解更多详细信息,并且因为操作~
是按位not或1s补码,它翻转位,因此语句产生11111111b
作为一个1
序列,在二进制级别处理数字时,MSB(最高有效位)被视为符号
,因此当将所有0
转换为1s
时,它会产生十进制值-1
例如,try~0
。并使用此代码获取数字的二进制表示形式(-3>>>0)。toString(2))
显然未定义的的位表示形式都是0
s。这可以通过以下方式看出:undefined | 0
,其计算结果为0
。因此,我们知道未定义的的位表示为全零
如果我们现在填充所有位(这正是~
所做的),我们得到所有1
s,这是-1
的表示
所有这些都可以工作,因为javascript的类型聚合。它用于将参数转换为数字<代码>ToInt32
定义为:
设number为tonnumber(参数)
ReturnIfAbrupt(编号)
如果数字为NaN,+0,−0, +∞, 或−∞, 返回+0。
依次返回NaN
,因此根据步骤3,ToInt32
返回0
而~0
是-1
对于任何人(像我一样)来说,想知道瓦片(~
)在JavaScript中的作用。因为JavaScript,这就是原因@JoseFaeti或者因为有人不能正确地学习它,这就是为什么!请您指出标准中规定“运算符转换为2的补码格式的有符号32位整数”的地方,链接到ToInt32
(我不是质疑您的答案,我只是好奇)?@Holt:我确实链接到了ToInt32
的定义。你想要一个NOT操作符规范的链接吗?是的,我找到了-这个标准比developer.mozilla.org上的文档要明确得多,我认为在你的帖子中为NOT
操作符添加一个链接(甚至引用)这个标准可能是个好主意。javascript中的所有位操作符都是使用(主要是)有符号32位整数-我说主要是因为的RHS和>>>的LHS和RHS都是无符号的32bit@JaromandaX我问这个问题是因为(对我来说)来自developer.mozilla.org
的引用有点模棱两可,但标准明确指向ToInt32
。