JavaScript成语:!something && function()

cpf*_*cpf 12 javascript

我一直在寻找的源代码raphael.js,我看到了很多的东西一样!variable && function()(如:!svg.bottom && (svg.bottom = this);)

这究竟是做什么的?它是先检查还是只在不是真的时才执行?

Yul*_*liy 8

正确.这是(ab)使用短路评估.布尔表达式仅在确定结果所需的范围内执行.在您的示例中,如果svg.bottom为非null,则!svg.bottomis false,并且结果为&&is false,因此右侧的执行不会发生.它基本上相当于if(!svg.bottom)svg.bottom = this;


Ari*_*tos 8

当您进行布尔运算时,编译器开始逐一检查每个条件,并在确定结果时停止 - 例如,如果您询问

if(a && b && c)
{    
}
Run Code Online (Sandbox Code Playgroud)

如果一个是假的,那么完整的布尔问题是假的,和编译器并不需要检查b和c。此编译器功能用于在某些情况下缩短编写代码。

这是(对我而言)编写代码的坏习惯。

!variable && function() 
Run Code Online (Sandbox Code Playgroud)

代替

if(!variable) function();
Run Code Online (Sandbox Code Playgroud)

尝试最小化 javascript 的大小?

难以调试,并且在许多情况下很难找到实际剂量。

看到这个类似的代码。

unsigned uCycleCheckBox(unisgned uCur)
{
  return ((uCur <= 1) ? (uCur?0:1) : (uCur==4)?2:(uCur+1));
}
Run Code Online (Sandbox Code Playgroud)

也是一样的想法......难以理解,难以调试,难以更改和在出现问题时修复。

对于这方面的评论,我建议阅读《编写可靠代码》和《调试开发过程》这本书。

编写可靠的代码比其他任何事情都重要。


EFr*_*aim 6

仅当第一部分(!svg.bottom)不为假时,它才使用短路规则来执行表达式的第二部分(实际上包括赋值).那就是svg.bottom是null- 设置为this.

  • `!svg.bottom &&(svg.bottom = this);`虽然很奇怪......只做`svg.bottom = svg.bottom ||会更简单 this`. (5认同)