2010-04-06 53 views

回答

4

正确。这是(ab)使用短路评估。布尔表达式只会根据需要执行以确定结果。在你的例子中,如果svg.bottom非空,那么!svg.bottomfalse,并且&&的结果是false,所以右侧的执行不会发生。它基本上相当于if(!svg.bottom)svg.bottom = this;

6

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

+5

'!svg.bottom &&(svg.bottom = this);'虽然很奇怪......只要执行'svg.bottom = svg.bottom || this'。 – James 2010-04-06 17:12:06

+0

@EFraim,不仅如果'svg.bottom'为'null',并且如果它是'undefined','0','NaN'是一个空字符串,当然也是'false'。 – CMS 2010-04-06 17:17:18

+0

是的,就像它缩写的'if'语句一样,尽管使用 if(!svg.bottom){svg.bottom = svg.bottom = this; } – 2010-04-06 17:17:19

0

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

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

+2

!“你好”是错误的...... – 2010-04-06 17:14:59

+1

虽然我相信'!“''是'true'。 – 2010-04-06 17:17:55

+0

这是正确的。检查规格:=] http://bclary.com/2004/11/07/#a-9.2 – 2010-04-06 17:22:56

0

有在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"; 

一个快速的方式说“从myObjperson财产得到firstName,或使用‘SID’如果person没有firstNamemyObj没有person“。

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

4

当你有布尔运算,编译器开始检查一个由其他的,而当其确定的结果停止 - 如果你问

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)); 
} 

是一样的想......让人难以理解,难以调试,难以改变,并在出现问题时解决。

对于这方面的意见,我建议阅读书籍,编写固体代码和破坏开发过程。

编写可靠的代码比其他东西更重要。

+0

也许他们是代码打高尔夫球;) – kennytm 2010-04-06 17:23:37

+0

什么是很难理解?! ;) – EFraim 2010-04-06 17:25:01

+0

而且只有问题的存在,一定要让你再想一想,是很难快速理解代码的剂量,它也难以调试,而且代码不仅仅是编写代码的映像。 – Aristos 2010-04-06 17:31:46