在C中我知道真假分别评估为1和0。在这种情况下show
只是打印到屏幕上......不确定这里发生了什么。我期待得到true
。这1
搞砸了我的业力。
show(1 && true);
true
show(true && 1);
1
答案 0 :(得分:23)
简单地说 - 这就是&&
的定义方式。在Javascript中,如果a && b
是假的,则a
会返回a
,如果b
是真的,则会a
。
如果a || b
是真实的,则a
会返回a
,如果b
是假的,则会a
。
这在直觉上是有道理的 - 如果a
中的a && b
为假,那么为什么还要费心阅读表达式的其余部分?你已经知道整件事都是假的。所以只返回false。但Javascript决定返回a
,这是假的,而不是弥补价值false
而无处不在。
这是基于所有C风格语言共同的短路评估。
它允许在Javascript中表达更多。例如这种模式:
var foo = function(opts) {
opts = opts || {}
// ...
}
实现可选参数opts
。如果根本未传递opts
,则opts = opts || {}
会将opts
设置为{}
,因此其余代码无需知道opts
wasn'过去了。
长期以来,它等同于以下内容:
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社区。由于这样的例子,并且基本上这样的事实是,真实值比使用短路||
的虚假值更加多样化,这比短路&&
更常见,就像你的问题一样。 / p>