2012-02-14 276 views
138

可能重复:
What is the !! (not not) operator in JavaScript?
What does the !! operator (double exclamation point) mean in JavaScript?双感叹号?

所以我调试运行一些代码和跨越这跑:

var foo.bar = 0; // this is actually passed from another function, adding it for context 

function(foo) 
    var someVar = !!foo.bar; 
    if(foo.bar){ 
     // ..stuff happens 
    } 
    else{ 
     // .. something else happens 
    } 
} 

好吧,我的问题是什么是点!!?所做的就是制作0 === false

  1. boolean(foo.bar)相比,使用它有什么好处吗?

  2. foo.bar可以被评估,因为0 === false已经是,所以为什么要经过转换? (someVar不再使用任何其他地方)

+2

嗯,我知道它是什么,我只是想知道什么是你的链接的问题没有解释的好处。 – jpalladino84 2012-02-14 21:50:20

+0

'0 == false'不'0 === false'三重等于阻止隐式尝试投射。 – Andrew 2018-01-31 22:16:00

回答

229

这一个值转换成布尔和确保了布尔类型

"foo"  = "foo" 
!"foo"  = false 
!!"foo" = true 

如果foo.bar被传递通过,那么它可能不是0,但一些其他falsy值。请参阅下面的真值表:

真值表为JavaScript

''  == '0'   // false 
0   == ''   // true 
0   == '0'   // true 
false  == 'false'  // false 
false  == '0'   // true 
false  == undefined  // false 
false  == null   // false 
null  == undefined  // true 
" \t\r\n" == 0    // true 

来源:道格·克罗克福德

的Javascript也变得非常怪异的,当涉及到NaN值。而且这是我能想到的唯一情况!会表现不同于===。

NaN === NaN  //false 
!!NaN === !!NaN //true 

// !!NaN is false 
+6

这实际上并没有回答这个问题。这个问题问:“foo.bar可以被评估,因为0 === false已经存在,所以为什么要通过转换?”你的回答解释了*它确保了布尔类型,但OP已经知道;问题是,确保布尔类型的*点*是什么? – ruakh 2012-02-14 21:52:53

+0

@ruakh if语句是隐含的,不会使用=== – Gazler 2012-02-14 21:54:01

+0

对不起,您能详细说说您的最后一条评论吗?因为我真的不明白它想要做什么。 : -/ – ruakh 2012-02-14 22:04:15

4

如上所述,它强制一个布尔类型的对象。你可以看到自己:

(function typecheck() { 
    var a = "a"; 
    var b = !a; 
    var c = !!a; 

    alert("var a = " + typeof(a) + "\n" + 
     "var b = " + typeof(b) + "\n" + 
     "var c = " + typeof(c)); 
})(); 

如果只是进行简单地比较,转换只是节省您以后在类型转换。

仅供参考,以下值被强制为FALSE在JavaScript:

  • “”
  • 不确定
+0

'强迫为假'你的意思是,如果我这样做:'var b =(nullthing)? 'sad':'happy''如果nullthing为0,null,未定义空白或false,我可以可靠地获得b ='happy'我可以发誓我有问题,它抱怨说在这些类型的情况下它是未定义的或无效的。 – PixMach 2015-04-15 00:18:01

+0

比较规则有点奇怪。 [这是一个很好的深入解释](http://www.sitepoint.com/javascript-truthy-falsy/)。在你给的例子中,你是正确的,你会得到一个参考错误。 – 2015-04-15 00:57:08

10

我想答案是没有多少意义。我们可以推测它是如何发生的:

  • 也许功能的早期版本在多个地方使用someVar,或者在真正从具有truefalse受益的方式,所以这更有意义。
  • 也许编写函数的人很习惯于使用!!来转换为true/false(s)他甚至没有注意到这里没有必要。
  • 也许编写函数的人会感觉到每个计算(在这种情况下,布尔转换)都应该赋予一个有意义的名称,方法是将某个变量赋值给它的结果。因为JavaScript中的布尔转换出人意料地容易出错(例如new Boolean(false)是一个真值数值),所以编写该函数的人感觉应该总是明确地完成而不是隐式地完成—即使效果是一样的—只是为了提请注意它作为一个潜在的错误点。
    • 当然,这预示着写函数的人会认为!!是“显式”布尔转换。从技术上讲,它不是—它使用相同的隐式布尔转换,if确实—,但如果您习惯了这种习惯用法,那么它相当于一个明确的转换。

但在我主观意见,没有这些原因,是一个非常好的一个!

+0

这是特别相关的,并且让我更喜欢这个答案; “(例如,新的布尔(假)是真值的值),” – 2017-01-18 05:30:19