在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