Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/408.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么~“未定义”;是JavaScript中的-1吗?_Javascript_Undefined - Fatal编程技术网

为什么~“未定义”;是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