为什么(true&& 1)返回1,但(1&& 1)返回true?

时间:2013-11-26 03:40:45

标签: javascript

在C中我知道真假分别评估为1和0。在这种情况下show只是打印到屏幕上......不确定这里发生了什么。我期待得到true。这1搞砸了我的业力。

show(1 && true);
true



show(true && 1);
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>