我一直在查看raphael.js的源代码,我看到很多像!variable && function()
这样的内容(例如:!svg.bottom && (svg.bottom = this);
)
这究竟是做什么的?它是先检查并仅在不是真的情况下执行吗?
答案 0 :(得分:7)
正确。这是(ab)使用短路评估。布尔表达式仅在确定结果所需的范围内执行。在您的示例中,如果svg.bottom
为非空,则!svg.bottom
为false
,&&
的结果为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"
是假的