2014-03-07 25 views
3

什麼是& &在這段JavaScript代碼的含義與運算符?意義在此行

function doIt(a) { 
    var b = a.parents(), 
    c = 1; 

    return b.each(function() { 
     jQuery(this).hasClass("free-content") && (c = 0) 
    }), c 
} 

通常我會認爲這將是一個邏輯運算符AND,但我無法弄清楚它在這一行中的作用。

+0

嘗試獲取非縮小的來源。 – Bergi

回答

4

邏輯AND操作者在這種情況下,代替IF語句來的被使用。它將爲c0如果jQuery(this).hasClass("free-content")返回truthy值。

它等同於:

if (jQuery(this).hasClass("free-content")) { 
    c = 0; 
} 

你想知道這是什麼意思其實是我不喜歡這種類型的編碼,並認爲這是一個不好的做法的原因。這很難閱讀,並可能造成混亂,反過來可能會產生錯誤。


這也是值得一提的是什麼邏輯回報,如果你想使用返回值:

(邏輯與)返回表達式1,如果它可以轉換爲false;否則,返回expr2。因此,利用布爾值使用時,& &返回true,如果這兩個操作數都爲真;否則,返回false。

這裏是展示一個例子,在我看來,糟糕的代碼,因爲它難以遵循:

var foo = bar && baz || qux; 

上面的代碼等同於:

var foo; 
if (bar && baz) { 
    foo = baz; 
} else { 
    foo = qux; 
} 

總結:不要使用邏輯運營商作爲漂亮的方式來取代IF語句或保存擊鍵。它很可能會回來,咬你或其他人的屁股。

我知道會有人在這方面與我爭論(通常是因爲ASI而不希望使用分號的人),但編寫只有專家才能理解的代碼是一個非常糟糕的主意。沒有任何理由反對它。

2
return b.each(function() { 

    jQuery(this).hasClass("free-content") && (c = 0) 
}), c 

b.each環比在b所有條目,並檢查當前元素是否具有類free-content集。 只有如果產生true,則表達式的第二部分被評估 - 因爲它們經由&&級聯和JavaScript停止評估這樣的表達時,第一部分是假的,因爲然後整個表達式不能成爲真正的任何更。

所以,如果有與該類的元素,所述第二部分被評估 - 並且由此c被設置爲值0(因爲這是賦值運算=那裏,而不是一個比較)。

each循環結束後,c值返回到外 - 因爲each()c經由comma operator ,這裏,從左至右,然後「返回」第二個評估其操作數相連。


JavaScript允許大量的「花哨」的編碼就是這樣,但是馬庫斯在他的答覆中說,這是難以閱讀,並沒有實際的優勢在這裏了,說

b.each(function() { 
    if(jQuery(this).hasClass("free-content")) { 
     c = 0; 
     return false; 
    } 
}); 
return c; 

我在each循環裏面加了return false,因爲一旦我們找到了這個類的元素,我們就不需要再搜索其餘的元素了 - 這就是那些提出原始代碼的人忘了做的事情在他們所有的「幻想」中......他們的循環將繼續遍歷所有的b的el如果它在第一輪中發現了它正在尋找的元素,那麼無關緊要。