2013-11-26 449 views
12

在C我知道true和false分別評估爲1和0。 show在這種情況下只是打印到屏幕上......不知道這裏發生了什麼。我期待回到true。這1正在搞亂我的業力。爲什麼(true && 1)返回1,但(1 && true)返回true?

show(1 && true); 
true 



show(true && 1); 
1 
+1

我只想指出,這種行爲在動態語言中很常見,可以在布爾上下文中使用任何值(Javascript,Python,Lua等)。 C也是一個奇怪的角落案例,因爲它沒有單獨的布爾類型,因此混合使用ints。 – hugomg

回答

23

簡而言之 - 這就是如何定義&&。在Javascript中,a && b返回a如果a是虛假的,並且b如果a是真的。

相反a || b回報a如果a是truthy和b如果a是falsy。

這很直觀 - 如果aa && b中是錯誤的,那麼爲什麼還要閱讀其餘的表達式呢?你已經知道整個事情是錯誤的。所以只需返回false。但是JavaScript決定返回a,這是虛假的,而不是彌補價值false從不知所措。

這是基於所有C風格語言通用的短路評估。

它允許在Javascript中有很多表現力。例如,此模式:

var foo = function(opts) { 
    opts = opts || {} 
    // ... 
} 

實現可選參數opts。如果opts根本沒有通過,opts = opts || {}opts設置爲{},所以剩下的代碼不必知道opts沒有通過。

在長手就等同於以下:

var x = a || b; // is equivalent to 
var x; 
if(a) { 
    x = a; 
} 
else { 
    x = b; 
} 

var y = a && b; // is equivalent to 
var y; 
if(!a) { 
    y = a; 
} 
else { 
    y = b; 
} 

因此JavaScript會比C或Java更加簡潔,因爲簡單if語句可以被替換全部是||&&。有時這會使代碼更簡潔,更不易讀,更像Perl,有時候它允許新的Javascript模式,例如opts = opts || {}

的另一個用途是在模式,如

var displayName = user.fullname || user.email; 

這意味着「使用現有的全名,如果,如果沒有,回落到電子郵件。」我個人覺得這個表達性和可讀性很好,但是這取決於你喜歡的Javascript社區的哪一部分可以說是簡潔和模糊的。由於這樣的例子,並且基本上這個事實,即truthy值更加多樣化,然後使用短路||比短路&&更爲常見,就像你的問題一樣。

+0

這是一個很好的答案。謝謝。 –

+0

在Javascript中使用&& ||相當普遍嗎?簡單的if語句的約定?我喜歡它簡潔。 –

+1

@KeithGrout我給出的兩個例子都用在我公司的生產代碼中。它可以說是簡潔而「聰明」且難以理解的,但許多人都認爲它是一種常見模式。這是你的判斷要求。 – djechlin

相關問題