我一直在寻找的raphael.js源代码,我看到了很多的东西一样!variable && function()
(例如:!svg.bottom && (svg.bottom = this);
)JavaScript的成语:什么&&()函数
是什么究竟怎么办?它是否首先检查并仅在不正确时才执行?
我一直在寻找的raphael.js源代码,我看到了很多的东西一样!variable && function()
(例如:!svg.bottom && (svg.bottom = this);
)JavaScript的成语:什么&&()函数
是什么究竟怎么办?它是否首先检查并仅在不正确时才执行?
正确。这是(ab)使用短路评估。布尔表达式只会根据需要执行以确定结果。在你的例子中,如果svg.bottom
非空,那么!svg.bottom
是false
,并且&&
的结果是false
,所以右侧的执行不会发生。它基本上相当于if(!svg.bottom)svg.bottom = this;
仅当第一部分(!svg.bottom
)非假时,它才使用短路规则来执行表达式的第二部分(实际上包括赋值)。那就是如果svg.bottom是null
- 将它设置为this
。
Javascript有许多奇怪的转换约定。 !
运算符将转换为布尔值。如果测试失败,&&
之后的部分将不会运行。
一些例子:
!undefined
是真的
!false
是真的
!0
是真的 !1
是假
!"hello"
是假
!“你好”是错误的...... – 2010-04-06 17:14:59
虽然我相信'!“''是'true'。 – 2010-04-06 17:17:55
这是正确的。检查规格:=] http://bclary.com/2004/11/07/#a-9.2 – 2010-04-06 17:22:56
有在JS使用逻辑运算符两种方便的方式,因为他们是不仅仅是布尔运算符。
随着&&
,你可以说“如果这个表达式是真的,评估下一个表达式是安全的”。最常见的用法是检查是否一个属性是它里面进一步深挖前非空:
var result = myObj.person && myObj.person.firstName;
如果myObj.person
未定义的result
值也将不确定的。
随着||
,你可以说“拿这个表达式的值,如果它truthy(不为空或在这方面不确定的),否则使用默认的”:
var result = person.firstName || "Sid";
结合使用这两种:
var result = (myObj.person && myObj.person.firstName) || "Sid";
一个快速的方式说“从myObj
的person
财产得到firstName
,或使用‘SID’如果person
没有firstName
或myObj
没有person
“。
虽然你提到的例子有点奇怪。在表达式中做一个副作用的操作有点难看。如果明确地将“只读”表达式与可变变量语句分开,通常更容易跟踪程序正在执行的操作。
当你有布尔运算,编译器开始检查一个由其他的,而当其确定的结果停止 - 如果你问
if(a && b && c)
{
}
如果一个是假的,那么例如布尔值为假,并且编译器没有需要检查b和c。 这种编译器的未来用于在某些情况下缩短编写代码。
这是(对我来说)编写代码的不好的做法。
!variable && function()
的
if(!variable) function();
尝试instide减少的JavaScript的大小?
难以调试,并且很难找到在许多情况下的实际剂量。
看到类似的代码。
unsigned uCycleCheckBox(unisgned uCur)
{
return ((uCur <= 1) ? (uCur?0:1) : (uCur==4)?2:(uCur+1));
}
是一样的想......让人难以理解,难以调试,难以改变,并在出现问题时解决。
对于这方面的意见,我建议阅读书籍,编写固体代码和破坏开发过程。
编写可靠的代码比其他东西更重要。
'!svg.bottom &&(svg.bottom = this);'虽然很奇怪......只要执行'svg.bottom = svg.bottom || this'。 – James 2010-04-06 17:12:06
@EFraim,不仅如果'svg.bottom'为'null',并且如果它是'undefined','0','NaN'是一个空字符串,当然也是'false'。 – CMS 2010-04-06 17:17:18
是的,就像它缩写的'if'语句一样,尽管使用 if(!svg.bottom){svg.bottom = svg.bottom = this; } – 2010-04-06 17:17:19