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

Posted

技术标签:

【中文标题】什么是“x && foo()”?【英文标题】:What is "x && foo()"? 【发布时间】:2011-10-21 16:06:12 【问题描述】:

我看到somewhere 别人说,

x && foo();

 等于

if(x)
    foo();

我对其进行了测试,他们确实做了同样的事情。 但为什么? x && foo()到底是什么?

【问题讨论】:

尽管这是一个巧妙的技巧,但我希望你不要使用它。它有效,但被认为是错误的形式。 是的,我同意@PortableWorld。 if(x)foo(); 或什至 if(x) foo(); 在一行中的使用几乎一样易于理解,更通用。 但请注意不要将其与if( x && foo() ) ... 混淆,if( x && foo() ) ... 可以接受并且具有不同的含义。我,一方面,不介意x && foo(),特别是如果这样的事情越来越多...... JS 受益于最小化。 这个习惯用法的一个很好的用法是window.console && console.log('xyz');,以防止错误的日志命令在未启用控制台的浏览器中引发错误。 为了记录,我认为这很漂亮。 【参考方案1】:

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

所以&& 仅在第一个表达式为真时才尝试第二个表达式(更具体地说,类似于真实)。第二个操作做的事情(无论foo() 的内容是什么)这一事实并不重要,因为它不会被执行除非第一个表达式的计算结果是真实的。如果是真的,则执行以尝试第二次测试。

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

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

【讨论】:

检查您的语言的语法规范,以确保您的语言遵循相同的快捷方式执行终止规则。确实存在违反它的传统语言。 实际上,在 Delphi 中,您可以为整个项目、特定文件,甚至围绕某个功能关闭它。疯狂的东西 :) docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/… @John:问题指定了 javascript……【参考方案2】:

这被称为short-circuit evaluation。

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

【讨论】:

啊,***的文章当然涵盖了所有内容。一如既往。 @Tchalvak:确实如此......如果你知道要寻找什么!【参考方案3】:

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

如果您对返回值不感兴趣(即xfoo() 是否都计算为真值的信息),它们是等价的,但通常,您应该只使用布尔逻辑版本如果你想将其用作布尔表达式,例如:

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

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

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

【讨论】:

【参考方案4】:

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

【讨论】:

【参考方案5】:

短路了。

&& 运算符的工作方式如下:它对两边的两个操作数进行逻辑或。如果左侧具有非零值,则评估右侧以确定真值。如果左侧为零,那么无论右侧是什么,表达式都将计算为 0,因此右侧是 not 计算的。所以实际上,如果x 不为零,则仅调用foo,如果x 为0,则不调用foo,因此,在这种情况下,它的工作方式类似于if - else

【讨论】:

以上是关于什么是“x && foo()”?的主要内容,如果未能解决你的问题,请参考以下文章

什么是帧数?什么是FPS?什么是PING?什么是延迟?什么是延时?什么是延迟时间?什么是时延?.

什么是PP,PE.什么是均聚..什么是共聚..什么是嵌段..什么是无规,什么是注塑。什么是吹膜..什

时间是什么?时间同步是什么?GPS北斗卫星授时又是什么?

什么是拉电流,什么是灌电流?什么是吸收电流 ?

在java中,OOA是什么?OOD是什么?OOP是什么?

什么是DIV,全称是什么?