回答
AND和OR運算符都可以使用快捷鍵。
因此&&
只有第一個表達式是真實的(更具體地說,類似於真實情況)纔會嘗試第二個表達式。第二個操作執行任務(無論foo()
的內容如何)並不重要,因爲它不會執行,除非第一個表達式的計算結果爲truthy。如果是真的,那麼將會執行以嘗試第二次測試。
相反,如果||
語句中的第一個表達式爲真,則第二個表達式不會被觸及。這樣做是因爲整個語句已經被評估過了,不管第二個表達式的結果如何,該語句都是正確的,所以它將被忽略並保持未執行。
當使用這樣的快捷方式時,需要注意的情況是操作員定義的變量仍然評估爲falsy值(例如0
)和真實值(例如'zero'
)的情況。
檢查您的語言的語法規範,以確保您的語言遵循相同的快捷方式執行終止規則。遺留的語言確實存在違反它的情況。 –
實際上,在Delphi中,您可以關閉整個項目,特定文件,甚至是某個特定功能。Crazy stuff :) http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN /html/devcommon/compdirsbooleanshortcircuitevaluation_xml.html –
@約翰:問題指定javascript ... –
在javascript中,&&
運算符從左到右評估並返回最右邊操作的值。如果第一個條件評估爲false,則不評估第二個條件。所以它簡寫爲「如果某物不爲空或未定義,請做些什麼」
這就是所謂的short-circuit evaluation。
在這種情況下,如果x
是假,那麼foo()
不需要進行評估(的&&
的結果總是假);如果x
爲真,則確實需要評估(即使結果被丟棄)。
這是短路。
&&
運算符的工作原理如下:它在邏輯或兩個操作數上執行操作。如果左側有非零值,則評估右側以確定真值。如果左側爲零,則無論右側如何,表達式將評估爲0,因此右側是而不是評估。所以實際上,如果x
非零,那麼只調用foo
,並且如果x
爲0,則不調用foo
,因此,在這種情況下它的工作原理與if - else
一樣。
這不完全相同。第一個是可以使用返回值的表達式;第二個是聲明。
如果您對返回值(即x
和foo()
是否評估爲真值)不感興趣,它們是等效的,但通常情況下,只有在您需要時才應使用布爾邏輯版本使用它作爲一個布爾表達式,例如:
if (x && foo()) {
do_stuff();
}
如果只在運行foo()
有條件感興趣(當x是truthy),所述第二形式是優選的,因爲它更清楚地傳達的意圖。人們可能更喜歡布爾邏輯版本的原因可能是JavaScript受到不同尋常的限制:源代碼大小(更詳細的源代碼意味着使用更多的帶寬);由於布爾邏輯版本使用較少的字符,因此它具有更高的帶寬效率。大多數情況下,我仍然更喜歡更詳細的版本,除非有關腳本的使用很多 - 對於像jQuery這樣的庫,使用像這樣的優化是完全合理的,但在大多數情況下並非如此。
- 1. 什麼是foo的MATLAB意義(X,Y:Z)
- 2. Foo()和Foo()是什麼樣的數組?
- 3. 這是什麼意思? int foo = foo + 4;
- 4. foo是什麼意思?
- 5. 什麼是AS3中的Foo?
- 6. @synthesize foo = _foo是什麼?
- 7. 「def function(foo)」中使用的「foo」是什麼:「使用Python3.x時的用法
- 8. 爲什麼「foo = foo || {};」不行?
- 9. 絕對(「/ foo」)和相對(「../foo」)文件名。什麼是「foo」類別?
- 10. 編程理論Gods Strike:什麼是Python 2.x中的target = foo?
- 11. 調用foo()後的x和y值是什麼?
- 12. Clojure中foo,:: foo,:: bar/foo和bar/foo之間的區別是什麼?
- 13. 什麼是{$ x}?
- 14. 對於任意Foo,「x = new(Foo)」與「x = new Foo」相同嗎?
- 15. FOO代表什麼?
- 16. using params [:foo]和@foo有什麼區別?
- 17. 「foo =(foo + 1)%bar」究竟幹什麼?
- 18. Foo :: class.java和Foo :: javaClass有什麼區別?
- 19. 什麼是wrapper_descriptor,在這種情況下爲什麼是Foo .__ init __()?
- 20. 函數(args){...}(foo)中的(foo)是什麼意思?
- 21. foo(&nil)與foo(&「不是proc」)有什麼不同?
- 22. 爲什麼const char * foo =「Hello」;編譯但不是const int * foo = 5;?
- 23. 這個命令是什麼:var a,foo =「foo」;意思?
- 24. 什麼是$ FOO的區別===真時真=== $ foo的
- 25. ifeq($(foo),)和ifndef foo之間的區別是什麼
- 26. 「virtual void IBase :: Foo」和「virtual void Foo」之間的區別是什麼?
- 27. memset(foo-> a + foo-> b,0,10)是什麼意思?
- 28. [foo,bar] = [「foo」,「bar」]功能的名稱是什麼?
- 29. AngularDart中map的註解等價物是什麼:const {'foo':'&foo'}?
- 30. 使用if(0 == foo())而不是(foo()== 0)有什麼好處?
即使這是一個光滑的技巧,我希望你不要使用它。它的作品,但它被認爲是不好的形式。 –
是的,我同意@PortableWorld。在單一行上的if(x){foo();}或者甚至是if(x)foo();只是一個可理解的,更一般的用法。 – Kzqai
但請注意不要將此與'if(x && foo()){...}'混淆,這是可以接受的並且具有不同的含義。舉個例子,我不介意'x && foo()',尤其是如果像這樣的事情變得很多...... JS從最小化中受益。 – vol7ron