Javascript 神秘的魔法密码,类型铸造

Javascript 神秘的魔法密码,类型铸造,javascript,Javascript,为什么这段代码返回0 a=!!function(){console.log(!0)}()+!!function(){console.log(!0)}() 这个返回2 a=!!function(){}+!!function(){} 它背后的魔力是什么 编辑: 这就是我所期望的: 函数{console.log!0}应返回true,因为它已成功执行,并且包含正文。因此,当它被强制转换为布尔值,然后是int时,它应该是1 函数{}这应该是false,因为它既不被调用也不包含函数体。同样的困惑!!

为什么这段代码返回0

 a=!!function(){console.log(!0)}()+!!function(){console.log(!0)}()
这个返回2

 a=!!function(){}+!!function(){}
它背后的魔力是什么

编辑: 这就是我所期望的: 函数{console.log!0}应返回true,因为它已成功执行,并且包含正文。因此,当它被强制转换为布尔值,然后是int时,它应该是1

函数{}这应该是false,因为它既不被调用也不包含函数体。同样的困惑!![]和

1:函数{}返回一个falsy值。 然后双位not将其转换为false。 结果:false+false==0

2:函数{}是一个真实值。 然后双位not将其转换为true。 结果:真+真===2

这些职能的内容与这个问题无关。第一行包含nothing,这是falsy。 第二行简单地将这两个函数转换为布尔函数

现在,当这些布尔值由于

Number(true)  // 1
Number(false) // 0

这两个函数都将以下值指定给

 a=!!function(){console.log(!0)}()+!!function(){console.log(!0)}()
!!函数{console.log!0}

函数{console.log!0}=>函数语句需要一个名称 !函数{console.log!0}=>返回true之前为false !!函数{console.log!0}=>返回false 在javascript中

false + false = 0
 true + true = 2
关于第二个功能

!!函数{}

函数{}=>函数语句需要一个名称 !函数{}=>false !! 函数{}=true 在javascript中

false + false = 0
 true + true = 2

这就是为什么你会得到2,神奇的是你在第一种情况下应用函数,而在第二种情况下你不应用它们,那是额外的一对

所以

鉴于

var y = function(){};
y;       // => function () {};
!!y;     // => true
!!y+!!y; // => true + true => 2
请注意,如果在第一种情况下不调用该函数,则会得到相同的结果:

var x = function(){console.log(!0)}
x;      // => function (){console.log(!0)}
!!x;    // => true
!!x+!!x // => true + true => 0
现在,当然,转换背后的原因是!!x-函数的对立面-false,而不是true,或42,或NaN,或NotABoolean,或FileNotFound属于Javascript中非常常见的类别


请不要用我可能会阅读、编辑或使用的真实代码编写此类代码。

这是一个严肃的问题吗?很明显前两个是生命,没有加在一起的结果,最后两个函数被强制转换为布尔函数together@AD7six我也不明白为什么它与我预期的相反。@AD7six我已经用我的预期编辑了我的问题。尽管你的预期有些奇怪,但要好得多。函数语句需要一个名称:不,iLife's not。例如,匿名函数也不是作为参数传递的。另外,你没有解释为什么这些函数是真是假。可以说,这是一个比另一个更好的结构化答案——但事实上是错误的,实际上并没有回答这个可疑的问题-1.@AD7six为什么错了?我只是忘了谈论这个,让你强制转换你的函数来做一些测试。我知道你不能把一个函数分配给一个var,或者创建一个匿名函数,大量用于回调或堆叠,但是这个在braquet表达式后面执行的express函数{}返回以下错误,它不是一个定义,您可以将一个函数分配给一个变量,例如jQuery将$a函数。您可以使用非常常见的函数创建匿名。我不确定上面评论的最后一部分是什么意思-可能在立即调用的函数表达式上找到一些文档。x/=>true我猜您正在控制台中查看-您误读了输出,如果未编辑,则答案是错误的/误导性的。x返回未定义的。这里没有WTF。编辑后:还是错的。是的,我错了。固定的谢谢。很抱歉,你的回答比问题本身更让我困惑。很抱歉。我希望其他答案会对你有更多帮助。所以,如果一个空匿名函数被强制转换为布尔函数,它将始终为true,并且当一个没有返回语句的函数被成功调用时,它将返回false?谁这样设计的?@Dharman:是的,这就是它的工作原理。至于是谁设计的,这有点像历史课。这个函数有更多的信息,我想进一步解释一下为什么是falsy和truthy。@Dharman:第一个函数没有return语句,所以返回undefined,正如我们所预料的那样,它是falsy。第二条语句尝试将函数强制转换为布尔值。因为函数不是的一部分,所以它被转换为true。