4 回答

TA貢獻(xiàn)1802條經(jīng)驗 獲得超6個贊
這是進(jìn)行類型轉(zhuǎn)換的一種非常模糊的方式。
!
是不是。所以!true
IS false
,和!false
是true
。!0
是的true
,!1
是的false
。
所以你要將一個值轉(zhuǎn)換為布爾值,然后將其反轉(zhuǎn),然后再將其反轉(zhuǎn)。
// Maximum Obscurity:val.enabled = !!userId;// Partial Obscurity:val.enabled = (userId != 0) ? true : false; // And finally, much easier to understand:val.enabled = (userId != 0);

TA貢獻(xiàn)1820條經(jīng)驗 獲得超3個贊
泡一些茶:
!!
不是運營商。它是兩用的!
- 這是邏輯“非”運算符。
理論上:
!
確定價值不是什么的“真相”:
事實是,這
false
不是true
(這就是為什么會!false
導(dǎo)致true
)事實是,這
true
不是false
(這就是為什么會!true
導(dǎo)致false
)
!!
確定價值不是什么的“真相” :
事實是,這
true
不是沒有true
(這就是為什么會!!true
導(dǎo)致true
)事實是,這
false
不是沒有false
(這就是為什么會!!false
導(dǎo)致false
)
我們希望在比較中確定的是關(guān)于參考值的“真實性” ,而不是參考本身的值。有一個用例我們可能想知道一個值的真相,即使我們期望值是false
(或假的),或者我們期望值不是typeof boolean
。
在實踐中:
考慮一個簡潔的功能,通過動態(tài)類型(又名“鴨子打字”)檢測功能功能(在這種情況下,平臺兼容性)。我們想編寫一個函數(shù),true
如果用戶的瀏覽器支持HTML5 <audio>
元素,則返回該函數(shù),但如果<audio>
未定義,我們不希望該函數(shù)拋出錯誤; 我們不想用來try ... catch
處理任何可能的錯誤(因為它們很嚴(yán)重); 而且我們也不想在函數(shù)內(nèi)部使用一個不能一致地揭示該特性的真相的檢查(例如,即使不支持HTML5 ,document.createElement('audio')
仍會創(chuàng)建一個被調(diào)用的元素)。<audio>
<audio>
以下是三種方法:
// this won't tell us anything about HTML5 `<audio>` as a featurevar foo = function(tag, atr) { return document.createElement(tag)[atr]; } // this won't return true if the feature is detected (although it works just fine)var bar = function(tag, atr) { return !document.createElement(tag)[atr]; }// this is the concise, feature-detecting solution we wantvar baz = function(tag, atr) { return !!document.createElement(tag)[atr]; }foo('audio', 'preload'); // returns "auto"bar('audio', 'preload'); // returns falsebaz('audio', 'preload'); // returns true
每個函數(shù)接受a <tag>
和a attribute
查找的參數(shù),但它們每個都根據(jù)比較確定的值返回不同的值。
但等等,還有更多!
你們中的一些人可能已經(jīng)注意到,在這個具體的例子中,人們可以使用稍微更高效的方法來檢查屬性,以檢查相關(guān)對象是否具有屬性。有兩種方法可以做到這一點:
// the native `hasOwnProperty` methodvar qux = function(tag, atr) { return document.createElement(tag).hasOwnProperty(atr); } // the `in` operatorvar quux = function(tag, atr) { return atr in document.createElement(tag); }qux('audio', 'preload'); // returns truequux('audio', 'preload'); // returns true
我們離題了......
無論這些情況多么罕見,可能存在一些場景,其中最簡潔,最高性能且因此最優(yōu)選的true
從非布爾值,可能未定義的值獲得的方法確實是通過使用!!
。希望這可笑地清除它。
添加回答
舉報