什么是“x && foo()”?

IT技术 javascript conditional and-operator
2021-01-20 12:36:02

我看到的地方去说,

x && foo();

 等于

if(x){
    foo();
}

我测试了它,他们确实做了同样的事情。
但为什么?究竟是x && foo()什么?

5个回答

AND 和 OR 运算符都可以使用快捷方式。

因此,&&只有在第一个表达式为真时才尝试第二个表达式(更具体地说,类似真实)。第二个操作做了什么(不管它的内容foo()什么)这一事实并不重要,因为除非第一个表达式的计算结果为真,否则它不会被执行如果它是真的,那么它将被执行以尝试第二个测试。

相反,如果||语句中的第一个表达式为真,则不会触及第二个表达式这样做是因为整个语句已经可以被评估,无论第二个表达式的结果如何,该语句都将导致 true,因此它将被忽略并保持未执行状态。

使用这样的快捷方式时要注意的情况当然是使用运算符的情况,其中定义的变量仍然计算为假值(例如0)和真(例如'zero')。

@John:这个问题指定了 javascript ......
2021-03-20 12:36:02
检查您的语言的语法规范以确保您的语言遵循相同的快捷方式执行终止规则。确实存在违反它的遗留语言。
2021-03-21 12:36:02
实际上,在 Delphi 中,您可以为整个项目、特定文件甚至某个功能关闭它。疯狂的东西:) docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/...
2021-04-02 12:36:02

这称为短路评估

在这种情况下,如果x是 False,则foo()不需要评估(结果&&将始终为 False);如果x为 True,则确实需要对其进行评估(即使结果被丢弃)。

@Tchalvak:它确实......如果你知道要寻找什么!
2021-03-13 12:36:02
啊,维基百科的文章肯定涵盖了这一切。一如既往。
2021-04-08 12:36:02

它并不完全等效。第一个是您可以使用的带有返回值的表达式;第二个是声明。

如果您对返回值(即x是否foo()评估为真值的信息)不感兴趣,则它们是等效的,但通常,仅当您想将其用作布尔值时,才应使用布尔逻辑版本表达式,例如:

if (x && foo()) {
    do_stuff();
}

如果您只对foo()有条件地运行感兴趣(当 x 为真时),则首选第二种形式,因为它更清楚地传达了意图。

人们可能更喜欢布尔逻辑版本的一个原因可能是 javascript 受到一个不寻常的限制:源代码大小(更详细的源代码意味着使用更多的带宽);由于布尔逻辑版本使用较少的字符,因此带宽效率更高。大多数时候我仍然更喜欢更详细的版本,除非有问题的脚本被大量使用 - 对于像 jQuery 这样的库,使用这样的优化是完全合理的,但在大多数其他情况下并非如此。

在 javascript 中,&&运算符从左到右求值并返回最右边操作的值。如果第一个条件的计算结果为 false,则不会计算第二个条件。所以它是说“如果某事不为空或未定义,做某事的简写

这是短路。

&&操作是这样的:它确实在逻辑上或两侧的两个操作数。如果左侧具有非零值,则评估右侧以确定真值。如果左侧为零,那么无论右侧是什么,表达式都将计算为 0,因此不会计算右侧所以实际上,如果x是非零则只foo调用,如果x是 0foo则不调用,因此,它的工作原理与if - else本例类似