2011-08-07 86 views
40

我看到別的somewhere說,什麼是「x && foo()」?

x && foo();

等於

​​3210

我測試了它,他們真的做了同樣的事情。
但是爲什麼? x && foo()究竟是什麼?

+28

即使這是一個光滑的技巧,我希望你不要使用它。它的作品,但它被認爲是不好的形式。 –

+4

是的,我同意@PortableWorld。在單一行上的if(x){foo();}或者甚至是if(x)foo();只是一個可理解的,更一般的用法。 – Kzqai

+4

但請注意不要將此與'if(x && foo()){...}'混淆,這是可以接受的並且具有不同的含義。舉個例子,我不介意'x && foo()',尤其是如果像這樣的事情變得很多...... JS從最小化中受益。 – vol7ron

回答

64

AND和OR運算符都可以使用快捷鍵。

因此&&只有第一個表達式是真實的(更具體地說,類似於真實情況)纔會嘗試第二個表達式。第二個操作執行任務(無論foo()的內容如何)並不重要,因爲它不會執行,除非第一個表達式的計算結果爲truthy。如果是真的,那麼將會執行以嘗試第二次測試。

相反,如果||語句中的第一個表達式爲真,則第二個表達式不會被觸及。這樣做是因爲整個語句已經被評估過了,不管第二個表達式的結果如何,該語句都是正確的,所以它將被忽略並保持未執行。

當使用這樣的快捷方式時,需要注意的情況是操作員定義的變量仍然評估爲falsy值(例如0)和真實值(例如'zero')的情況。

+3

檢查您的語言的語法規範,以確保您的語言遵循相同的快捷方式執行終止規則。遺留的語言確實存在違反它的情況。 –

+0

實際上,在Delphi中,您可以關閉整個項目,特定文件,甚至是某個特定功能。Crazy stuff :) http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN /html/devcommon/compdirsbooleanshortcircuitevaluation_xml.html –

+5

@約翰:問題指定javascript ... –

3

在javascript中,&&運算符從左到右評估並返回最右邊操作的值。如果第一個條件評估爲false,則不評估第二個條件。所以它簡寫爲「如果某物不爲空或未定義,請做些什麼

24

這就是所謂的short-circuit evaluation

在這種情況下,如果x是假,那麼foo()不需要進行評估(的&&的結果總是假);如果x爲真,則確實需要評估(即使結果被丟棄)。

+0

啊,維基百科文章當然涵蓋了所有。一如既往。 – Kzqai

+4

@Tchalvak:它確實......如果你知道要尋找什麼! – Johnsyweb

2

這是短路。

&&運算符的工作原理如下:它在邏輯或兩個操作數上執行操作。如果左側有非零值,則評估右側以確定真值。如果左側爲零,則無論右側如何,表達式將評估爲0,因此右側是而不是評估。所以實際上,如果x非零,那麼只調用foo,並且如果x爲0,則不調用foo,因此,在這種情況下它的工作原理與if - else一樣。

8

這不完全相同。第一個是可以使用返回值的表達式;第二個是聲明。

如果您對返回值(即xfoo()是否評估爲真值)不感興趣,它們是等效的,但通常情況下,只有在您需要時才應使用布爾邏輯版本使用它作爲一個布爾表達式,例如:

if (x && foo()) { 
    do_stuff(); 
} 

如果只在運行foo()有條件感興趣(當x是truthy),所述第二形式是優選的,因爲它更清楚地傳達的意圖。人們可能更喜歡布爾邏輯版本的原因可能是JavaScript受到不同尋常的限制:源代碼大小(更詳細的源代碼意味着使用更多的帶寬);由於布爾邏輯版本使用較少的字符,因此它具有更高的帶寬效率。大多數情況下,我仍然更喜歡更詳細的版本,除非有關腳本的使用很多 - 對於像jQuery這樣的庫,使用像這樣的優化是完全合理的,但在大多數情況下並非如此。

相關問題