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

12

在C语言中,我知道True和False分别评估为1和0。show在这种情况下只是打印到屏幕上...不确定发生了什么。我希望能够收到true的回复。这个1搞乱了我的节奏。

show(1 && true);
true



show(true && 1);
1

1
我想指出的是,在允许您在布尔上下文中使用任何值的动态语言(如Javascript、Python、Lua等)中,这种行为非常普遍。C语言也是一个奇怪的特例,因为它没有单独的布尔类型,因此将int用于该目的。 - hugomg
1个回答

23
简单来说-这就是&&的定义。在Javascript中,a && b会返回a,如果a为假,并且返回b,如果a为真。
相反地,a || b会返回a,如果a为真并且返回b,如果a为假。
直观地讲,这是有意义的-如果在a && ba是false,那么为什么还要读取表达式的其余部分呢?你已经知道整个表达式都是false。所以只需返回false。但是Javascript决定返回a,它是假的,而不是从无处返回值false
这基于所有C风格语言中普遍使用的短路求值。
这使得Javascript具有很多表现力。例如,此模式:
var foo = function(opts) {
    opts = opts || {}
    // ...
}

实现一个可选参数opts。如果根本不传递optsopts = 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社区不同,它可能过于简短和晦涩。正是因为像这样的例子,以及实际上真值比假值更加多样化,使用短路运算符 ||比使用短路运算符&&更加常见,就像您提出的问题一样。

在Javascript中,使用&& ||约定来进行简单的if语句是相当常见的吗?我喜欢它的简洁性。 - Keith Grout
1
@KeithGrout 我在我的公司的生产代码中都使用了我提供的两个示例。它们可能有点简洁、"聪明"和难以阅读,但很多人将其视为一种常见的模式。这是你自己的判断。 - djechlin
我喜欢使用这个技巧来声明和不覆盖全局命名空间或变量:window.foo || (window.foo = {}); - Labu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接