微博客

昨晚,我看了Douglas Crockford讲解的题为“JavaScript编程语言”的视频,并从中学到一些有关JavaScript中与(AND)、非(OR)逻辑运算符的有趣内容。我想,应该把它分享给大家。

首先,先让我们一起看一下逻辑与(AND)运算符。

1if(expr1 && expr2){//do something }

按照我对此运算符(operator)的早期理解,如果操作数(operand)“expr1”和“expr2”同时为时,那么上面的代码片段将会执行任何位于if语句块中的内容。这是绝对正确的,并且恰好也是如此工作。唯一的蹊跷是,究竟幕后实际发生了什么。根据Mozilla的JavaScript文档对逻辑运算符(logical operators)的说明。

(逻辑与)若expr1可转换为false[译注1],则返回expr1;否则,返回expr2。因此,当使用布尔值时,若两个操作数都是true,则&&运算符返回true;否则,返回false。

因此换言之,这意味着,若expr1,则expr1 && expr2将返回expr2,否则将返回expr1

注意:当逻辑与(&&)运算符与非布尔值(non Boolean Values)一起使用时,其运算结果不会返回“true”或“false”,而是返回两个表达式中的某一表达式本身。

好酷,让我们根据这一信息对if语句块一探究竟。因此,若expr1,则expr1 && expr2返回expr2。此刻,只有当expr2时,该if语句块才会执行。

因此,为了if语句块能得以执行,最终两个表达式都需为,这正如我们一开始所讨论的那样。

让我们来看下如何利用这个特性来重构一种常见场景,即,我们希望只有当某对象存在时,才调用该对象的某个方法。

初始代码:

1if(a){
2return a.method();
3
}else{
4
return a;
5
}

重构的代码:

1return a && a.method();

重构的代码做了一模一样的事情,但是比初始代码表现力更丰富且速度更快。

现在,让我们看下逻辑或(OR)

根据定义:

(逻辑或)若expr1可转换为true,则返回expr1;否则,返回expr2。因此,当使用布尔值时,若任一操作数是true,则||运算符返回true;若两个操作数都是false,返回false。

或换言之,若expr1,则expr1 || expr2将返回expr1,否则返回expr2

再次注意:当逻辑非(||)运算符与非布尔值(non Boolean Values)一起使用时,其运算结果不会返回“true”或“false”,而是返回两个表达式中的某一表达式本身。

这个特性可用于以表达式风格来定义变量的缺省值。

1var myVar = input ||default;

此处,若input为真,则myVar将被赋为input,否则被赋为default

好了,就到此为止吧。如果您有任何问题或建议,那么请尽管在twitter上联系我或者在下面发表评论,而且我会尽我所能帮您解答!

译注

[1] 可转换为false,可转换为false是指计算结果为null、0、空字符串("")、或者undefined的那些表达式。反之,除了前面提到的那些特殊值以外,其他计算结果均可转换为true。有关逻辑运算符(Logical Operators)的更多内容,请参见Mozilla的在线说明文档

转载自:http://www.ituring.com.cn/article/642

posted on 2011-11-25 09:14  飞鸟42  阅读(395)  评论(1编辑  收藏  举报