在C我知道true和false分別評估爲1和0。 show
在這種情況下只是打印到屏幕上......不知道這裏發生了什麼。我期待回到true
。這1
正在搞亂我的業力。爲什麼(true && 1)返回1,但(1 && true)返回true?
show(1 && true);
true
show(true && 1);
1
在C我知道true和false分別評估爲1和0。 show
在這種情況下只是打印到屏幕上......不知道這裏發生了什麼。我期待回到true
。這1
正在搞亂我的業力。爲什麼(true && 1)返回1,但(1 && true)返回true?
show(1 && true);
true
show(true && 1);
1
簡而言之 - 這就是如何定義&&
。在Javascript中,a && b
返回a
如果a
是虛假的,並且b
如果a
是真的。
相反a || b
回報a
如果a
是truthy和b
如果a
是falsy。
這很直觀 - 如果a
在a && 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值更加多樣化,然後使用短路||
比短路&&
更爲常見,就像你的問題一樣。
這是一個很好的答案。謝謝。 –
在Javascript中使用&& ||相當普遍嗎?簡單的if語句的約定?我喜歡它簡潔。 –
@KeithGrout我給出的兩個例子都用在我公司的生產代碼中。它可以說是簡潔而「聰明」且難以理解的,但許多人都認爲它是一種常見模式。這是你的判斷要求。 – djechlin
我只想指出,這種行爲在動態語言中很常見,可以在布爾上下文中使用任何值(Javascript,Python,Lua等)。 C也是一個奇怪的角落案例,因爲它沒有單獨的布爾類型,因此混合使用ints。 – hugomg