什么是“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】:这并不完全等同。第一个是可以使用的带有返回值的表达式;第二个是声明。
如果您对返回值不感兴趣(即x
和foo()
是否都计算为真值的信息),它们是等价的,但通常,您应该只使用布尔逻辑版本如果你想将其用作布尔表达式,例如:
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?什么是延迟?什么是延时?什么是延迟时间?什么是时延?.