昨晚,我看了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{
4return 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的在线说明文档。