为什么这段代码返回0
a=!!function(){console.log(!0)}()+!!function(){console.log(!0)}()
并且这个返回2
a=!!function(){}+!!function(){}
背后的魔力是什么?
修改
这就是我所期望的:
function(){console.log(!0)}()
应该返回true,因为它成功并且包含正文。所以当它被转换为boolean然后是int时,它应该是1
function(){}
这应该是假的,因为它既没有被调用也没有包含函数体。与!![]
和!!""
答案 0 :(得分:1)
1:function(){}()
返回falsy
值
然后,!!
,双按位not
,将其转换为false
结果:false + false === 0
。
2:function(){}
是truthy
值
然后,!!
,双按位not
,将其转换为true
结果:true + true === 2
。
这些功能的内容与此问题无关。第一行包含IIFE's,不返回任何内容,即falsy
第二行简单地将2个函数强制转换为布尔值。
现在,当这些布尔值转换为数字时(由于+
operator),这就是结果:
Number(true) // 1
Number(false) // 0
答案 1 :(得分:-1)
两个函数都分配给以下值
a=!!function(){console.log(!0)}()+!!function(){console.log(!0)}()
<强> !!函数(){的console.log(!0)}()强>
在javascript中
false + false = 0
关于第二个功能
a=!!function(){}+!!function(){}
!! function(){}
在javascript中
true + true = 2
这就是为什么你得到2
答案 2 :(得分:-1)
“魔法”是你在第一种情况下应用函数,而你不在第二种情况下应用它们(这是额外的一对())。
所以
var x = function(){console.log(!0)}
x; // => function (){console.log(!0)}
x(); // => false
!!x(); // => false
!!x()+!!x() // => false + false => 0
,而
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中非常常见的"Wat ??"类别。
请永远在我可能阅读,编辑或使用的实际代码中编写此类代码。