2011-06-27 229 views
3

我正在研究underscore.js的src,發現這樣的:Javascript邏輯運算符:?

_.isRegExp = function(obj) { 
    return !!(obj && obj.test && obj.exec && (obj.ignoreCase || obj.ignoreCase === false)); 
}; 

爲什麼 「!」用過的?它應該被看作是NOT-NOT還是有一些深奧的JS細微差別在這裏?

+0

這就是所謂的簡寫,而不是一個深奧的JS深奧微妙的細微差別JS笑 – dynamic

+1

。與'+'運算符用於轉換爲一個數字(例如:'+「0」')相同的方式,並且使用'+「」'轉換爲一個字符串。 – HoLyVieR

+1

可能重複[什麼是!!運營商在JavaScript?](http://stackoverflow.com/questions/784929/what-is-the-operator-in-javascript) –

回答

12

這只是一種將結果強制轉換爲布爾值的方式。

+1

好不知道 – dynamic

2

是的,這不是。它是一種常用的習慣用法,將一個值轉換爲具有相同真實性的布爾值。

JavaScript能夠理解0.0''nullundefinedfalse作爲falsy,以及任何其他值(包括,很明顯,true)作爲truthy。該成語將所有前者轉換爲布爾型false,後者全部轉換爲布爾型true

在這種特殊情況下,

a && b 

將返回b如果兩個ab是truthy;

!!(a && b) 

將返回true如果兩個ab是truthy。

+1

你忘了'NaN'(as falsey)。 – user113716

+0

哦該死的,所以我做了... :) – Amadan

0

這只是兩個!運營商彼此相鄰。但雙重否定是毫無意義的,除非你正在使用!像運營商轉換爲布爾類型。

它會轉換任何東西真的還是假的......

1

的& &運營收益有誤或表達式中的最後一個值:

("a" && "b") == "b" 

的||運算符返回第一個值,結果爲真

("a" || "b") == "a" 

該!運算符返回一個布爾型

!"a" == false 

所以,如果你想將一個變量轉換爲布爾值,你可以使用!

var myVar = "a" 
!!myVar == true 

myVar = undefined 
!!myVar == false