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

Kei*_*out 12 javascript

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

show(1 && true);
true



show(true && 1);
1
Run Code Online (Sandbox Code Playgroud)

dje*_*lin 23

简单地说 - 这是如何&&定义的.在Javascript中,a && b返回aif 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 || {}
    // ...
}
Run Code Online (Sandbox Code Playgroud)

实现可选参数opts.如果opts没有传入,opts = opts || {}将设置opts{},所以其余的代码不必知道opts没有传递.

从长远来看,它相当于以下内容:

var x = a || b; // is equivalent to
var x;
if(a) {
    x = a;
}
else {
    x = b;
}
Run Code Online (Sandbox Code Playgroud)

var y = a && b; // is equivalent to
var y;
if(!a) {
     y = a;
}
else {
    y = b;
}
Run Code Online (Sandbox Code Playgroud)

因此,Javascript可以比C或Java简洁得多,因为简单的if语句可以被替换||&&完全替换.有时这会使代码更简洁,更不易读,更像Perl,有时它允许新的Javascript模式,比如opts = opts || {}.

另一种用途是模式

var displayName = user.fullname || user.email;
Run Code Online (Sandbox Code Playgroud)

这意味着"如果可用则使用全名;如果没有,请回复电子邮件." 我个人觉得这个表达性和可读性,但它可以说是简洁和模糊,取决于你来自哪个Javascript社区.由于这样的例子,并且基本上这样的事实,即真值是多样化的,那么使用短路的虚假值||比短路更常见&&,就像你的问题一样.