2011-09-19 60 views
5

我一直在與同事辯論這個話題大概一週。我非常喜歡速記代碼,儘可能使用三元數等。最近,他一直在關注我使用雙重驚歎號。經過多次測試後,我開始同意他的觀點......在我的代碼中使用雙重驚歎號可能並不明智。考慮到這一點:JS雙感嘆號 - 有沒有什麼好的理由使用它?

var myvar = "Hello"; 
return (!!myvar ? "Var is set" : "Var is not set"); 

上述示例按預期工作。但是,如果我們檢查可能返回未定義的變量,則會發生錯誤,尤其是在IE7中。我們得到了我們預期的結果,但是,如果我們在控制檯中運行以下命令:

​​

使用這種方法,如果變量是不確定的,它靜靜地失敗。這讓我質疑完全使用雙重感嘆號。有沒有真正讓這個運營商受益的情況?

回答

5

!!x強制x爲一個布爾值,其屬性爲x == !!xtypeof !!x === "boolean"。 (如果您覆蓋valueOf,可能並非如此,但我現在不想考慮它。)

9

在JavaScript中有一個有效的用於!!。這是一個表達式,它將取值並轉換爲布爾值truefalse。它基本上將當前狀態強制轉換爲布爾值。

這有利於雙方

  1. 捕捉值
  2. 騰出收集原始對象的感實性(應該說是最終參考)
  3. 有助於防止物體後不正確用法強制平等(==)。不會阻止它們全部,而是將它強制爲bool刪除一組場景。
+0

(給予好評使用單詞「感實性」!) 很好的解釋,這也是值得注意的是,當你使用這個操作是這樣的: 'return !!(window.Object &&(obj1.function1 || obj.2function2)));' 它擴展了整個「強制轉換」所有的東西。 convertallthethings.jpeg –

0

所以,我的理解是typeof !!x === "boolean"和它背後的邏輯(!x蒙上爲倒布爾,!!x回反向,等等),但我想知道,如果它是自然存在問題?如果您投射一個未定義的變量,則最終會出現腳本錯誤。我期望!!x == false如果typeof !!x === "undefined",但事實並非如此。看來,這將是更安全的選擇:

if((typeof x != "undefined") && (x != null)) { ... } 

有人可以提供其中使用!!x是比較合適的場景?目前,我沒有看到使用它的好處。

抓我的頭......

1

我在IE測試 - !!undefined返回false。我認爲這是一種正確的行爲。

至於哪裏!!是(或可能)有用。

下面是一個例子:

假設你有一個接受參數的函數:

function test(param) { if (param === true) { alert('OK'); } }

與呼叫:test(1)不會彈出警告窗口 - 儘管人們普遍認爲1一個true或一個true價值。是的,有人可能會認爲這取決於團隊中的協議,並且每個開發人員都負責傳遞正確的數據類型 - 但JavaScript中正確的數據類型是什麼?特別是當你沒有編譯器來驗證哪個是哪個。

因此,在上述情況下,我會使用的if (!!param)代替if (param === true)

+0

'!! param'和'param === true'是不一樣的; '!! param'將爲每個「falsy」值,'false','undefined','NaN'返回'false',而'param === true'只會返回'true',如果'param'是布爾類型,並設置爲「true」。 就像你所說的,如果團隊同意這個類型應該是布爾型的,不要傳遞其他類型。如果它需要嚴格的類型,就像提醒一樣,我個人使用約定來將參數命名爲與其類型相關的參數。像'function chocolatestarfish(xInt,yBool){// stuff};'等 –