2010-06-17 243 views
5

爲什麼有人使用表達式像這個表達意味着什麼「!!」

if(!!window.JSON) alert('exists'); 

,而不是僅僅

if(window.JSON) alert('exists'); 

「!!」還有其他用法嗎?東西?

+0

多底片是雖然明白了,這就是原因。如果你繼續在你的代碼中使用if(!!(!!)!!!(!)!! obj),那麼只有你可以維護它(如果你幸運的話) - 我不是不虛的! – simendsjo 2010-06-17 07:10:20

+1

請參閱http:// stackoverflow。/ 1406604/what-does-operator-double-exclamation-point-mean-in-javascript/1407769#1407769;你是對的,在這種情況下,它是多餘的,因爲'if()'已經轉換爲布爾型 – Christoph 2010-06-17 07:19:26

回答

1

!是一種邏輯否定,!!是邏輯否定應用兩次,即邏輯身份

我會假設你正在閱讀的代碼只是無害(雖然令人費解)冗餘。

+0

是的,但是這個問題不涉及從對象到布爾型的隱式類型轉換嗎? – 2010-06-17 07:11:25

15

!!只會導致一個布爾值轉換,沒有必要在所有使用此與if語句結構,也是在你的第一個片段,轉換對象布爾是沒有意義的,這將是總是如此

,可以強制對false值只有nullundefinedNaN0和空字符串,當然false任何東西都不會強迫於true

當使用!!時,您希望確保獲得布爾結果,例如使用邏輯運算符&&||時。

的經營者可以返回操作數的值,而不是一個布爾結果,例如:

true && "foo"; // "foo" 
"foo" || "bar" ; // "foo" 

假設你有一個測試兩個值的函數,你期望一個布爾結果:

function isFoo() { 
    return 0 && true; 
} 

isFoo(); // returns 0, here it makes sense to use !! 

編輯:看你的編輯,if (!!window.JSON)僅僅是多餘的,因爲我之前說的,因爲if statement本身願買電子健康當計算條件表達式時,使布爾轉換internally

+0

看起來像你的意思寫'function isFoo(obj){return obj&& true;} isFoo(0);'在最後一個例子:)或'return !! obj&& true;' – Znarkus 2010-06-17 07:38:13

+0

'false &&「foo」評估爲* false *。 – Gumbo 2010-06-17 07:38:57

+0

@Gumbo:是的,是一個錯字/ false/true,@Znarkus,是的,只是爲了說明目的;)謝謝你們...... – CMS 2010-06-17 07:41:04

2

他們可能試圖將對象轉換爲布爾值。通過對對象應用布爾運算符(!),它會變成布爾值,但它們實際上並不需要否定,因此它們會應用第二個取消第一個。

2
// !! = boolean typecasting in javascript 

var one = 1 
var two = 2; 

if (one==true) app.alert("one==true"); 
if (!!one==true) app.alert("!!one==true"); 

if (two==true) app.alert("two==true"); // won't produce any output 
if (!!two==true) app.alert("!!two==true"); 
+0

這就是爲什麼你應該使用'==='並明確地投射:'= ='類型轉換規則是WTF的一些東西 – Christoph 2010-06-17 07:37:22

1

它是一個布爾轉換,確保首次轉換爲布爾值,然後否定回原始值。

然而,使用不當這裏只會真的是相關的,如果你把它分配給另一個變量 - 由於性能原因

var isJSON = (!!window.JSON); 

if (isJSON) doX; 
if (isJSON) doY; 
if (isJSON) doZ;