标签:
在Javascript中,逻辑运算符主要用于布尔型的逻辑运算,可以根据表达式的运算结果返回一个布尔值。由于参数并不一定非得是true或者false(它们可以蕴涵真或者假的意义),因此返回的结果也可以不是一个布尔值。
要理解这个“或”(||)运算符的作用,我们先来看一个相对简单的例子。在下面这个例子中,或运算符可以被用来为一个新定义好的变量提供一个默认值:
<!-- lang: js -->
var bar = false,
foobar = 5,
foo = bar || foobar; // foo = 5
在上面这个例子当中,只有当bar蕴涵假的时候,foobar才会将它自身的值传递给foo。在这里需要指出,包括0,false,undefined,null,NaN和空字符串”“这些类型都是蕴涵假的。
如果你写过jQuery插件,或者使用过$.extend()方法,这种用法你可能会比较熟悉。你会发现这个方法常常被用于给一个options对象约定默认值,或者赋予确切值。
<!-- lang: js -->
function( options ) {
options = $.extend({}, defaults, options || {});
}
一些开发人员喜欢特意使用或算符将蕴涵假的值统一转换为null。这样做的好处是可以确保这些值都是空。
<!-- lang: js -->
var foo = bar || null;
通常情况下,我们并不特意需要一个null值,不过当你确实需要的时候,这样做你就不需要纠结这个值究竟是不是你想要的值,或者这个值是不是必须得是null值。
你也会发现一些开发人员选择使用这种方法去初始化命名空间,不同于传统上使用 namespace = namespace || {} 先进行命名空间的初始化,然后再扩展这个命名空间,我们还可以直接一步到位:
<!-- lang: js -->
var namespace = namespace || {
utils:{},
core:{}
};
在这里我们简单介绍一下原理。由于Javascript的变量并不是有严格的类型的,所以一个通过布尔算符初始化的变量也可以被赋予一个数值值:
<!-- lang: js -->
console.log(null || NaN || undefined || false || 0 || 10); // outputs: 10
这里发生的事情并不是那么神奇,其实只是表达式偷了一下懒。解析器会先确认表达式的第一个语句,null,确定了这是一个蕴涵假的值,继续向下解析直到遇到一个不蕴涵假的值(或者如果一直没有遇到不蕴涵假的值,则返回最后一个值)。这是一个在包括Javascript在内的各种动态语言中经常使用的解析技巧。不过这种方法并不适用与静态语言,如果你在静态语言中这样做系统会直接抛出一个类型错误。
那么这究竟有什么用处呢?像我们之前看到的一样,如果一个变量有可能是空,那么或运算符可以在函数中用来提供一个默认值:
function foo( a, b ){
a = a || 5;
b = b || 6;
console.log( ‘Values:‘ + a + ‘,‘ +b );
}
当然,你也可以使用如下的方法来解决这个问题:
if(a && a === 5){
// do something
}else{
// do something else
}
为什么要这样写呢?我们可以从两个方面分析这个问题。首先是可读性,一些开发人员认为if/else语句的可读性更强,那么在心里解读这一段代码不需要花较多的时间去理解。我认为如果只是从喜好角度考虑的话,我们用if/else语句完全可以达到相同的效果。其次是性能问题,开发人员普遍认为if语句要比||算符性能更佳,不过通过测试发现它们之间的表现力并没有非常大的区别。
标签:
原文地址:http://my.oschina.net/jndion/blog/394917