博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
巧用JavaScript中的逻辑运算符
阅读量:6180 次
发布时间:2019-06-21

本文共 2081 字,大约阅读时间需要 6 分钟。

数据类型

不像Java等语言中逻辑运算符只能作用于特定类型的数据,如在Java中只能作用于boolean/Boolean类型的操作数,JavaScript中的这些运算符可以作用于任意表达式

这得益于JavaScript的各种数据类型的数据都能通过一定的规则转换成布尔型,通过将任意类型的值传入Boolean这个内置函数作为参数,得到的返回值true或false就是根据这些规则进行转换得到的,具体规则如下:

  • 能转换成false的值(表达式):0, -0, null, false, NaN, undefined, ""(空字符串)
  • 能转换成true的值(表达式):除了能转换成false的除外的都可以转换成true

当我们使用if(expr){...}while(expr){...}等需要判断true/false的地方,表达式expr的值可以是任意类型的值,可以理解为实际使用的值是通过Boolean(expr)得到的true/false。

巧用Boolean函数可以让代码,更简洁,以下是一个例子:

//这是一个常见的需求://我们的函数接受一个参数file,这个参数可以是一个对象,也可以是一个对象的数组,我们的函数要对一个或多个对象进行统一的处理//我们希望无论传入的是单个对象,还是一个数组,甚至是空的,都统一放进一个数组进行处理,我们可以这么写:function myFunc(file, otherArg){  var arr = [];  if(file && !Array.isArray(arr)){    arr.push(file);  }else{    arr.concat(file);  }  arr.forEach(function(item){/*do something with item*/});}//虽然Array.prototype.concat可以接受一个对象或者一个数组,但是我们怕传入的是undefined或null//因此我们可以做个过滤:function myFunc2(file, otherArg){  var arr = [].concat(file).filter(function(item){    return item;  });  //do something with the arr}//发现没有,Boolean是一个函数,刚好可以作为Array.prototype.filter的参数,于是我们得到更简洁的写法:function myFunc3(file, otherArg){  var arr = [].concat(file).filter(Boolean);  //do something with arr}

以上用法其实是笔者在github上很多高质量的项目中发现的,非常受用。善用语言的特性,可以让我们的代码更简洁,更优雅。

另外,有时候我们想得到一个对象/值对应的布尔值true/false,除了可以用Boolean函数,还可以用以下表达式!!expr得到,参考下一节对逻辑运算符的介绍。

逻辑表达式的返回值

与例如Java的很多其他语言不同,JavaScript中的逻辑表达式的返回值也不只是简单的true/false,而是通过特定的规则返回操作数中的某一个或者是返回true/false,规则如下:

  • 逻辑运算(&&)表达式: expr1 && expr2
    如果Boolean(expr1)为false,则返回expr1;否则返回expr2;相当于Boolean(expr1)?expr2:expr1
  • 逻辑运算(||)表达式: expr1 || expr2
    如果Boolean(expr1)为true, 则返回expr1;否则返回expr2; 相当于Boolean(expr1)?expr1:expr2
  • 逻辑运算 (!)表达式: !expr
    如果Boolean(expr)为true,则返回false; 否则返回true

一些便捷的写法

利用上述的特性,我们可以用更简洁的方式完成很多以前用if-else和cond?a:b完成的任务,以下是个例子:

function Car(options){  //用if-else  if(!options){    options = {};  }  //用cond?a:b  options = options?options:{};  //巧用逻辑运算符  options = options || {};  }

注意事项

  • 当操作数是数字、或者字符串时,要格外小心,因为Boolean(expr)为false的情形中包含了0, -0, 空字符串这几个特殊的值,很多时候我们只是希望将null和undefined当作false,而一切数字和字符串都当成true;这个问题对于对象类型的操作数无须考虑

转载于:https://www.cnblogs.com/waychan/p/6845052.html

你可能感兴趣的文章
支持二次开发的Zigbee模块(SNAP技术)
查看>>
我的友情链接
查看>>
软件测试常用术语
查看>>
linux磁盘与文件系统管理
查看>>
ORACLE 索引详解
查看>>
第五课_课后习题解答
查看>>
Linux日志系统分析
查看>>
Linux下双网卡绑定bond0
查看>>
你是否也在服务器租用的过程中对服务器各方面的问题产生疑问呢????
查看>>
SSH2屌丝增强版1:构建GenericDao
查看>>
nfs服务配置
查看>>
内存不足导致不能执行system
查看>>
Android Studio导出jar包
查看>>
通过python 爬取网址url 自动提交百度
查看>>
我的友情链接
查看>>
乔布斯走了,苹果会坠落吗?
查看>>
java高级_01
查看>>
win8重装成win8.1后把hyperv的虚拟机导入
查看>>
linux命令汇总(mkdir、rmdir、touch、dirname、basename)
查看>>
mv或者cp带小括号文件名解析问题总结
查看>>