2010-02-01 36 views
29

我明白what the double not operator does in JavaScript。我很好奇它是否有用,以及我最近提出的斷言是否正確。何時在JavaScript中使用double not(!!)運算符

我說if (!!someVar)是從來沒有意義的,也不是(!!someVar && ...,因爲無論是if&&會導致someVar作爲一個布爾值進行評價,對!是多餘的。

事實上,我唯一能想到的是,使用double not運算符是合法的,如果你想對另一個布爾值進行嚴格比較(所以也許在返回值期望true或false明確)。

這是正確的嗎?我開始懷疑自己,當我注意到jQuery 1.3.2同時使用if (!!someVar)return !!someVar && ...

在這些情況下,double是否沒有任何實際效果?

我個人的意見是,這隻會導致混淆。如果我看到一條if語句,我知道它正在評估它是一個布爾值。

+2

請注意(正如賈斯汀在他的回答你指出的問題中指出http://stackoverflow.com/questions/1406604/what-does-the-operator-double-exclamation-point-mean-in-javascript/ 1407785#1407785),沒有雙重操作符。 '!!'僅僅適用於非運算符兩次。 – outis 2010-02-01 04:31:36

+1

這個'操作符'是慣用語的定義......除非你知道它是什麼,否則你很可能會感到困惑或者僅僅把它誤認爲是一個'不'。我將開始使用它來混淆我的同事:D如果有人感興趣,我在jQuery.grep – Sprague 2013-11-28 16:50:50

+0

中看到了'wild'中的相關內容:[if(!! condition)和if (條件)](http://stackoverflow.com/q/19818574/1048572) – Bergi 2014-07-19 17:45:54

回答

36

if statements我和你在一起的情況下,它是完全安全的,因爲在國內,ToBoolean操作將在條件表達式(看到關於規範步驟3)執行。

但是,如果你想,讓說,從函數返回一個布爾值,你應該確保其結果將是實際布爾值,例如:

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

console.log(isFoo()); // will show zero 
typeof isFoo() == "number"; 

總之,Boolean Logical Operators可以返回操作數,而不是一個Boolean結果必然:

的邏輯與運算符(&&),將返回秒操作數的值,如果第一是噸ruly

true && "foo"; // "foo" 

它將返回第一個操作數的值,如果它是由本身falsy

NaN && "anything"; // NaN 
0 && "anything"; // 0 

在另一方面,邏輯運算符OR(||)將返回的第二個操作數的值,如果第一個是falsy

false || "bar"; // "bar" 

它將返回第一個操作數的值,如果它本身就是非falsy:

"foo" || "anything"; // "foo" 

也許這是值得一提的是,falsy值是:nullundefinedNaN0,零長度字符串,當然還有false

別的(即不falsy,一個Boolean對象或Boolean值),在boolean context評價,將返回true

+0

另一種說法是:邏輯AND運算符返回遇到第一個「falsy」操作數,而邏輯OR運算符返回第一個「真值」操作數。此外,爲了完整性,-0也被認爲是「虛假」。 – TMcManemy 2014-08-10 20:16:12

+0

如果您處於需要'!! expr'某種情況,請考慮將它寫爲'Boolean(expr)',以便於閱讀,因爲它在功能上是等效的。 – conny 2017-11-10 07:13:44

0

是的,當你想要0 || 1返回值時使用!! var。

一個是bool值的簡單比較,當你希望「a == b」等價於「a xor not b」,除了a = 5和b = 7都是真實的但不相等。

另一種是當你要強迫一組條件到一個變量的位:

var BIT_NONEMPTY=1; 
var BIT_HASERRORS=2; 
var BIT_HASCHILDREN=4; 
var BIT_HASCONTENT=8; 

result_bitfields = 
    (!!countLines())*BIT_NOTEMPTY + 
    (!!errorCode())*BIT_HASERRORS + 
    (!!firstChild())*BIT_HASCHILDREN + 
    (!!getContent())*BIT_HASCONTENT; 

在Javascript中不是很有用,其生活的位值很遠,但有時可能是有用的。

+3

No:!!轉換爲false或true,而不是0或1.(在您的位域示例中,true由操作符*強制爲1,false爲0)。 – Doin 2015-02-07 14:12:27