JavaScript成语:!某事&&功能()

时间:2010-04-06 17:07:14

标签: javascript

我一直在查看raphael.js的源代码,我看到很多像!variable && function()这样的内容(例如:!svg.bottom && (svg.bottom = this);

这究竟是做什么的?它是先检查并仅在不是真的情况下执行吗?

5 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:6)

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

答案 2 :(得分:4)

当你有布尔运算时,编译器开始检查另一个,并在确定结果时停止 - 例如,如果你要求

if(a && b && c)
{    
}

如果 a 为false,则布尔值为false ,编译器需要检查b和c。 此编译器的未来用于缩短某些情况下的编写代码。

这是(对我而言)编写代码的不良做法。

!variable && function() 

instide of

if(!variable) function();

尝试最小化javascript的大小?

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

请参阅此类似代码。

unsigned uCycleCheckBox(unisgned uCur)
{
  return ((uCur <= 1) ? (uCur?0:1) : (uCur==4)?2:(uCur+1));
}

同样的想法......难以理解,难以调试,难以改变并在遇到问题时修复。

对于这方面的评论,我建议阅读书籍,编写固体代码,以及对开发过程进行补偿。

编写可靠代码比其他内容更重要。

答案 3 :(得分:0)

在JS中使用逻辑运算符有两种方便的方法,因为它们不仅仅是布尔运算符。

使用&&,您可以说“如果此表达式为真,则可以安全地评估下一个表达式”。最常见的用法是在进一步深入内部之前检查属性是否为非空:

var result = myObj.person && myObj.person.firstName;

如果未定义myObj.person,则result的值也将不确定。

使用||,您可以说“如果它是真实的(在此上下文中不为null或未定义),则取该表达式的值,否则使用默认值”:

var result = person.firstName || "Sid";

结合两者:

var result = (myObj.person && myObj.person.firstName) || "Sid";

快速说“从firstName的{​​{1}}属性获取person,或在myObj没有person时使用”Sid“或firstName没有myObj“。

你提到的例子虽然有点奇怪。在表达式中执行副作用操作有点难看。如果您明确地将“只读”表达式与变量变异语句分开,通常更容易跟踪您的程序正在执行的操作。

答案 4 :(得分:-1)

Javascript有许多奇怪的转换约定。 !运算符将强制转换为布尔值。如果测试失败,则&&之后的部分将不会运行。

一些例子:
!undefined是真的 !false是真的 !0是真的 !1是假的 !"hello"是假的