[英]Why use !! to coerce a variable to boolean for use in a conditional expression?
在那個特定的上下文中,我會說使用!!
明確轉換為布爾值之間沒有區別!!
或者讓if表達式自然地轉換為布爾值。 我的意思是if (x)
將被解釋為if (Boolean(x))
,它與if (!!x)
。
但是,如果要從函數返回值,例如,如果要實現arrayHasItems
函數,則可以通過以下方式實現它:
function arrayHasItems(arr) {
return arr.length;
}
在if語句中使用函數將起作用,因為從函數返回的數值將轉換為布爾值。 但是,客戶端代碼期望函數返回一個布爾值,因此他可能通過執行以下操作來檢查條件:
if (arrayHasItems(arr) === true) {}
在這種情況下,它會失敗,因為來自arrayHasItems
的返回結果是一個數字。 因此,通過返回類似於expect的布爾值來實現該函數會更好。
function arrayHasItems(arr) {
return !!arr.length;
}
編輯:
這提出了一個新問題:為什么!! arr.length而不僅僅是arr.length> 0
在產生的結果和你甚至沒有保存字節之間沒有任何區別,因為兩個語句都使用相同數量的字符。 但是我創建了一個測試用例 ,雙重否定似乎表現得更好,但它可能在所有瀏覽器中都不一致。
如上所述,它將值轉換為布爾值,因此與if(x)
沒有太大區別。 但是,兩者都很棘手,因為它也會將0
轉換為false
和其他類似的東西。
它與JavaScript類型的coersion有關。
通常你想檢查對象是否為空,未定義,不是0等。檢查對象的常用方法是
if (obj) {
...
}
但是,如果你想要條件等於true
或false
!
可以在非布爾對象實例上使用。 下面是一個使用等值運算符===
的示例,該運算符不執行類型coersion。
var obj = {};
console.log(obj === true); // returns false
console.log(!obj === false); // returns true
console.log(!!obj === true); // returns true
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.