Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript “什么是”呢;x&&;foo();?_Javascript_Conditional_And Operator - Fatal编程技术网

Javascript “什么是”呢;x&&;foo();?

Javascript “什么是”呢;x&&;foo();?,javascript,conditional,and-operator,Javascript,Conditional,And Operator,我看到别人说 x&&foo()  等于 if(x){ foo(); } 我测试了一下,他们真的做了同样的事情。 但是为什么呢?什么是x&&foo()?AND和OR运算符都可以使用快捷方式 因此,&&仅在第一个表达式为真时才尝试第二个表达式(更具体地说,类似于真值)。第二个操作进行填充(无论foo()的内容如何)这一事实并不重要,因为它不会执行,除非第一个表达式的计算结果是真实的。如果是真实的,则将执行,以尝试第二次测试 相反,如果|语句中的第一个表达式为true,则不会触及第二个表达式

我看到别人说

x&&foo()

 等于

if(x){
    foo();
}
我测试了一下,他们真的做了同样的事情。
但是为什么呢?什么是
x&&foo()

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

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

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


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

在javascript中,
&&
运算符从左到右计算,并返回最右边操作的值。如果第一个条件的计算结果为false,则不计算第二个条件。因此,它是“如果某个东西不是空的或未定义的,那么做某件事”的简写,这被称为


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

这是短路


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

它并不完全等效。第一个是一个表达式,返回值可以使用;第二个是陈述

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

if (x && foo()) {
    do_stuff();
}
如果您只对有条件地运行
foo()
感兴趣(当x为truthy时),那么最好使用第二种形式,因为它更清楚地表达了您的意图


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

即使这是一个巧妙的技巧,我希望您不要使用它。它可以工作,但被认为是糟糕的形式。是的,我同意@PortableWorld
if(x){foo();}
甚至
if(x)foo()几乎是可以理解的,更一般的用法。但是请注意不要将其与
if(x&&foo()){…}
混淆,后者是可以接受的,并且具有不同的含义。一、 首先,不要介意
x&&foo()
,特别是如果像这样的事情经常发生。。。JS从最小化中获益。这个习惯用法的一个好用法是
window.console&&console.log('xyz')防止错误日志命令在未启用控制台的浏览器中抛出错误。我认为这很好。啊,维基百科的文章当然涵盖了这一切。和往常一样。@Tchalvak:是的。。。如果你知道该找什么!检查语言的语法规范,确保语言遵循相同的快捷方式执行终止规则。传统语言确实存在违反它的情况。实际上,在Delphi中,您可以为整个项目、特定文件甚至某个函数关闭它。。疯狂的东西:)@John:问题是…