爲什麼有人使用表達式像這個表達意味着什麼「!!」
if(!!window.JSON) alert('exists');
,而不是僅僅
if(window.JSON) alert('exists');
?
「!!」還有其他用法嗎?東西?
爲什麼有人使用表達式像這個表達意味着什麼「!!」
if(!!window.JSON) alert('exists');
,而不是僅僅
if(window.JSON) alert('exists');
?
「!!」還有其他用法嗎?東西?
!是一種邏輯否定,!!是邏輯否定應用兩次,即邏輯身份
我會假設你正在閱讀的代碼只是無害(雖然令人費解)冗餘。
是的,但是這個問題不涉及從對象到布爾型的隱式類型轉換嗎? – 2010-06-17 07:11:25
!!
只會導致一個布爾值轉換,沒有必要在所有使用此與if
語句結構,也是在你的第一個片段,轉換對象布爾是沒有意義的,這將是總是如此。
,可以強制對false
值只有null
,undefined
,NaN
,0
和空字符串,當然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。
他們可能試圖將對象轉換爲布爾值。通過對對象應用布爾運算符(!
),它會變成布爾值,但它們實際上並不需要否定,因此它們會應用第二個取消第一個。
// !! = 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");
這就是爲什麼你應該使用'==='並明確地投射:'= ='類型轉換規則是WTF的一些東西 – Christoph 2010-06-17 07:37:22
它是一個布爾轉換,確保首次轉換爲布爾值,然後否定回原始值。
然而,使用不當這裏只會真的是相關的,如果你把它分配給另一個變量 - 由於性能原因
var isJSON = (!!window.JSON);
if (isJSON) doX;
if (isJSON) doY;
if (isJSON) doZ;
多底片是雖然明白了,這就是原因。如果你繼續在你的代碼中使用if(!!(!!)!!!(!)!! obj),那麼只有你可以維護它(如果你幸運的話) - 我不是不虛的! – simendsjo 2010-06-17 07:10:20
請參閱http:// stackoverflow。/ 1406604/what-does-operator-double-exclamation-point-mean-in-javascript/1407769#1407769;你是對的,在這種情況下,它是多餘的,因爲'if()'已經轉換爲布爾型 – Christoph 2010-06-17 07:19:26