Javascript逻辑运算符“或”的应用
Javascript逻辑运算符“或”的应用
jndion2011 发表于3年前
Javascript逻辑运算符“或”的应用
  • 发表于 3年前
  • 阅读 362
  • 收藏 20
  • 点赞 1
  • 评论 1

【腾讯云】新注册用户域名抢购1元起>>>   

摘要: 译文

在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语句要比||算符性能更佳,不过通过测试发现它们之间的表现力并没有非常大的区别。

  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 2
博文 12
码字总数 8228
评论 (1)
山哥
应该还有且的运算:a && (doSomething)
×
jndion2011
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: