簡體   English   中英

為何使用!! 將變量強制轉換為布爾值以用於條件表達式?

[英]Why use !! to coerce a variable to boolean for use in a conditional expression?

!!x將變量x的類型強制轉換為布爾值,同時保持其真實性或缺乏真實性 - 請參閱此問題 - 我對在條件表達式中使用它有疑問。

在JS代碼中我見過幾次!! 用於在if條件下將變量強制轉換為boolean類型

if(!!x) {
    x.doStuff();
}

其中的想法是在調用方法之前測試是否定義了x

但是,在我自己的代碼中,我總是使用它

if(x) {
    x.doStuff();
}

在如果定義了x的前提下,條件將通過,如果x未定義,則不會通過。

所以我的問題是使用!! x強制轉換為布爾值什么意思!! 在這種情況下? 什么是這個代碼這個代碼不?

在那個特定的上下文中,我會說使用!!明確轉換為布爾值之間沒有區別!! 或者讓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) {
  ...
}

但是,如果你想要條件等於truefalse ! 可以在非布爾對象實例上使用。 下面是一個使用等值運算符===的示例,該運算符不執行類型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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM