神秘的魔法代码,类型铸造

时间:2014-05-28 09:47:01

标签: javascript

为什么这段代码返回0

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

并且这个返回2

 a=!!function(){}+!!function(){}

背后的魔力是什么?

修改 这就是我所期望的:
function(){console.log(!0)}()应该返回true,因为它成功并且包含正文。所以当它被转换为boolean然后是int时,它应该是1

function(){}这应该是假的,因为它既没有被调用也没有包含函数体。与!![]!!""

相同的混淆

3 个答案:

答案 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)}()

  • function(){console.log(!0)}() =&gt;函数语句需要名称
  • !function(){console.log(!0)}() =&gt;返回true(以前是假的)
  • !! function(){console.log(!0)}() =&gt;返回false

在javascript中

false + false = 0

关于第二个功能

 a=!!function(){}+!!function(){}

!! function(){}

  • function(){} =&gt;函数语句需要名称
  • !function(){} =&gt;假
  • !! function(){} = true

在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 ??"类别。

永远在我可能阅读,编辑或使用的实际代码中编写此类代码。