2013-11-26 385 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

相关问题