![](/img/trans.png)
[英]Why does lodash `_.all([true, true, true], true);` return `false`?
[英]Why does ( true && 1 ) return 1, but ( 1 && true ) returns true?
在CI中,知道真假分別評估為1和0。 在這種情況下show
只是打印到屏幕...不知道這里發生了什么。 我期待得到true
回來。 這個1
是搞亂我的人緣。
show(1 && true);
true
show(true && 1);
1
簡單地說 - 這就是&&
的定義方式。 在Javascript中, a && b
返回a
,如果a
是falsy和b
,如果a
是truthy。
反過來a || b
a || b
返回a
,如果a
是truthy和b
,如果a
是falsy。
這在直覺上是有道理的 - 如果a
a && b
中a && b
a
是假的,那么為什么還要費心閱讀表達式的其余部分呢? 你已經知道整件事都是假的。 所以只返回false。 但是Javascript決定返回a
,這是假的,而不是彌補值false
而無處不在。
這是基於所有C風格語言共有的短路評估。
它允許在Javascript中表達很多。 例如這種模式:
var foo = function(opts) {
opts = 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 || {}
opts = opts || {}
。
另一種用途是模式
var displayName = user.fullname || user.email;
這意味着“如果可用則使用全名;如果沒有,請回復電子郵件。” 我個人覺得這個表達性和可讀性,但它可以說是簡潔和模糊,取決於你來自哪個Javascript社區。 由於這樣的例子,基本上事實上truthy值比falsy值更加多樣化,使用短路||
比你的問題中的短路&&
更常見。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.