2011-02-19 44 views
27

我看到了這條線在jQuery.form.js源代碼:使用&&短路作爲if語句?

g && $.event.trigger("ajaxComplete", [xhr, s]); 

我首先想到的是WTF?

我的下一個想法是,我不能決定,如果這是醜陋或優雅。

我不是一個Javascript大師,所以我的問題是雙重的。首先,我想確認我的理解正確。在上述行等同於:

if (g) { 
    $.event.trigger("ajaxComplete", [xhr, s]); 
} 

其次在Javascript是這個共同的/接受的做法?一方面它是簡潔的,但另一方面,如果你以前沒有見過,它可能有點神祕。

+0

考慮到在第二種情況下甚至不需要這些大括號,我會投票不清楚和醜陋,但我也不是JavaScript大師。 – cst1992 2016-03-22 11:49:29

回答

17

是的,你的兩個例子是等價的。它在幾乎所有的語言中都是這樣工作的,但它在Javascript中變得相當習慣。就我個人而言,我認爲在某些情況下這很好,但在其他情況下可能會被濫用。但它確實比較短,這對於最小化JavaScript加載時間非常重要。

另見Can somebody explain how John Resig's pretty.js JavaScript works?

2

是的,你瞭解它(在這種情況下);是的,這是JavaScript中的標準做法。

+0

它在C#中肯定不是標準做法。事實上,它甚至不會編譯「只有賦值,調用,增量,減量和新的對象表達式纔可以用作語句」 – Davy8 2011-02-19 05:22:52

+0

而且只有當後半部分返回`bool`時,否則您將得到「&&操作符無法應用到類型'布爾'和'[任何類型的後半部分返回]'「 – Davy8 2011-02-19 05:25:15

+0

的參數,你需要把它放在括號內並賦值。只爲你,我會刪除有關C#的一點,因爲這個問題是關於JavaScript的。 – CarneyCode 2011-02-19 05:26:24

2

是的,它相當於您寫的if。這當然不是一種不常見的做法。是否接受取決於誰在(或不在)接受...

10

它的標準,但既不JSLint也不JSHint喜歡它:

預計轉讓或函數調用,而是看到了一個表達。

6

你必須要小心,因爲這種短路可以繞過如果在有條件的||

false && true || true 
> true 

爲了避免這種情況,一定要組的條件句:

false && (true || true) 
> false