总结JavaScript中布尔操作符||与&&的使用技巧


Posted in Javascript onNovember 17, 2015

你是否看到过这样的代码:a=a||""; 可能javascript初学者会对此感到茫然。今天就跟大家分享一下我的一些心得。
其实:
 

a=a||"defaultValue";

a=a||"defaultValue";

与:

if(!a){
a="defaultValue";
}
if(!a){ 
  a="defaultValue"; 
}

 
和:

if(a==null||a==""||a==undefined){
a="defaultValue";
}

if(a==null||a==""||a==undefined){ 
  a="defaultValue"; 
}

 
是等价的!
为了弄清这个问题,首先我们必须了解一个问题:javascript中数据类型在转换为bool类型时发生了什么。
 
在javascript中,数据类型可以分为“真值”和“假值”。顾名思义,真值转换为bool时值为true;假值转换为bool时值为false。下表罗列了一些常见的数据类型转换为bool时的值:
总结JavaScript中布尔操作符||与&&的使用技巧 
在if表达式中,javascript首先将条件表达式转换为bool类型,表达式为真值则执行if中的逻辑,否则跳过。
 
于是有了:
 

if(!a){
a="defaultValue";
}


if(!a){ 
  a="defaultValue"; 
}

 
下面我们再来看“&&”、“||”两个表达式。
由于javascript是弱类型语言,所以在javascript中这两个表达式可能跟其他语言(比如java)中不太一样。
在javascript中,“&&”运算符运算法则如下:
 
如果&&左侧表达式的值为真值,则返回右侧表达式的值;否则返回左侧表达式的值。
 
这就是说:

var i=""&&"真值";//->i=""
i="真值"&&"其他真值";//->i="其他真值"
i="真值"&&"";//->i=""
var i=""&&"真值";//->i="" 
i="真值"&&"其他真值";//->i="其他真值" 
i="真值"&&"";//->i=""

 
“||”运算符的运算法则如下:
 
如果||左侧表达式的值为真值,则返回左侧表达式的值;否则返回右侧表达式的值。
 
这就是说:
 

var i=""||"真值";//->i="真值"
i="真值"||"其他真值";//->i="真值"
i="真值"||"";//->i="真值"
var i=""||"真值";//->i="真值" 
i="真值"||"其他真值";//->i="真值" 
i="真值"||"";//->i="真值"

 
 
于是,就可以理解:
 

a=a||"defaultValue";
a=a||"defaultValue";

的逻辑了。如果a为假值(等于null、空字符串……),则将"defaultValue"赋给a;否则将a的值赋给a本身。
 
 
下面我们运用||、&&来简化程序:
 

var parameter="";
function test(parameter){
//return 真值
return true;
}
//真值操作
function operate1(parameter){
return "真值操作";
}
//假值操作
function operate2(parameter){
return "假值操作";
}
var result=test(parameter)&&operate1(parameter);
result=test(parameter)||operate2(parameter);
//等价于
result=test(parameter)?operate1(parameter):operate2(parameter);
alert(result);//真值操作
//也等价于
if(test(parameter)){
result=operate1(parameter);
}else{
result=operate2(parameter);
}
alert(result)//真值操作

再比如:

<script language="javascript" type="text/javascript"> 
  var a =1; 
  var b = 0; 
  var c = 3; 
  var d = a && b && c; 
  window.alert(d); 
</script>

输出了d的值为0,如果把d的值改为不等于0的值,那么d将始终是3

所以js中的&&返回的是第一个不为真的值即是0(对象亦可),如果全部都是真那么返回的最后一个值。
    

<script language="javascript" type="text/javascript"> 
  var a =0; 
  var b = 3; 
  var c = 5; 
  var d = a || b || c; 
  window.alert(d); 
</script>

输出了d的值为3,如果把b的值改为0,那么d将始终是5.如果全部都改为0,那么d的值是0.</p><p>所以js中的||返回的是第一个不为false的值即是0(对象亦可),如果全部都是false那么返回的最后一个值。 
应用:

比如要简单的验证邮箱格式,只有‘@''和‘.''都同时存在是才算格式正确,否则提示错误:

该用哪个呢?让我们分析一下:

if (form1.elements[3].value.indexOf("@",0)==-1 && form1.elements[3].value.indexOf(".",0)==-1){ alert("EMAIL地址输入错误!")}

如果都存在:&&两边都是假。&&返回第一个为真的值,所以if判断条件是假if后面的语句不执行!不会提示用户。

只有至少@和。存在一个的是时候if的条件才为真,才提示用户错误。

两个都存在的时候,返回最后一个的值,是真 if判断条件成立if语句执行。提示用户错误。

所以用&&明显错误!

要换成

if (form1.elements[3].value.indexOf("@",0)==-1 || form1.elements[3].value.indexOf(".",0)==-1){ alert("EMAIL地址输入错误!") }

分析:

如果两个都存在:全部为false,返回是false 所以if条件不成立,语句不执行,不提示错误!

如果只有一个存在:返回第一个不为false的值。返回为true 提示错误!

两个都不存在:返回第一个不为false的值,返回是true 提示错误!

所以应该用|| 

Javascript 相关文章推荐
javascript高级学习笔记整理
Aug 14 Javascript
tangram框架响应式加载图片方法
Nov 21 Javascript
js 删除数组的几种方法小结
Feb 21 Javascript
javascript解三阶幻方(九宫格)
Apr 22 Javascript
深入理解JS继承和原型链的问题
Dec 17 Javascript
微信小程序 视图容器组件的详解及实例代码
Jan 19 Javascript
angularjs实现搜索的关键字在正文中高亮出来
Jun 13 Javascript
vuejs+element-ui+laravel5.4上传文件的示例代码
Aug 12 Javascript
JavaScript中一些特殊的字符运算
Aug 17 Javascript
React操作真实DOM实现动态吸底部的示例
Oct 23 Javascript
微信小程序实现tab左右切换效果
Nov 15 Javascript
javascript实现搜索筛选功能实例代码
Nov 12 Javascript
实例代码讲解jquery easyui动态tab页
Nov 17 #Javascript
用JavaScript来美化HTML的select标签的下拉列表效果
Nov 17 #Javascript
基于Jquery easyui 选中特定的tab
Nov 17 #Javascript
jquery实现简单的表单验证
Nov 17 #Javascript
将JavaScript的jQuery库中表单转化为JSON对象的方法
Nov 17 #Javascript
基于jquery实现可定制的web在线富文本编辑器附源码下载
Nov 17 #Javascript
Jquery ajax 同步阻塞引起的UI线程阻塞问题
Nov 17 #Javascript
You might like
php结合表单实现一些简单功能的例子
2011/06/04 PHP
php生成图片验证码-附五种验证码
2015/08/19 PHP
阿里对象存储OSS在laravel框架中的使用方法
2019/10/13 PHP
js返回上一页并刷新的多种实现方法
2014/02/26 Javascript
EasyUI Datebox 日期验证之开始日期小于结束时间
2017/05/19 Javascript
React Native 使用Fetch发送网络请求的示例代码
2017/12/02 Javascript
vue-cli axios请求方式及跨域处理问题
2018/03/28 Javascript
浅析java线程中断的办法
2018/07/29 Javascript
WebGL学习教程之Three.js学习笔记(第一篇)
2019/04/25 Javascript
微信小程序云开发之数据库操作
2019/05/18 Javascript
layui实现给某一列加点击事件
2019/10/26 Javascript
Vue项目结合Vue-layer实现弹框式编辑功能(实例代码)
2020/03/11 Javascript
JS+canvas五子棋人机对战实现步骤详解
2020/06/04 Javascript
[02:35]DOTA2英雄基础教程 末日使者
2013/12/04 DOTA
Python装饰器原理与用法分析
2018/04/30 Python
python基础梳理(一)(推荐)
2019/04/06 Python
树莓派使用python-librtmp实现rtmp推流h264的方法
2019/07/22 Python
Python学习笔记之文件的读写操作实例分析
2019/08/07 Python
numpy创建单位矩阵和对角矩阵的实例
2019/11/29 Python
python实现FTP文件传输的方法(服务器端和客户端)
2020/03/20 Python
python 串行执行和并行执行实例
2020/04/30 Python
Pandas对DataFrame单列/多列进行运算(map, apply, transform, agg)
2020/06/14 Python
Python调用高德API实现批量地址转经纬度并写入表格的功能
2021/01/12 Python
Android本地应用打开方法——通过html5写连接
2016/03/11 HTML / CSS
HTML5之SVG 2D入门4—笔画与填充
2013/01/30 HTML / CSS
L’AGENCE官网:加州女装品牌
2018/06/03 全球购物
英国旅行箱包和行李箱购物网站:Travel Luggage & Cabin Bags
2019/08/26 全球购物
思想品德自我评价
2014/02/04 职场文书
《小动物过冬》教学反思
2014/04/17 职场文书
银行纠风工作实施方案
2014/06/08 职场文书
2014年网管工作总结
2014/12/11 职场文书
企业战略合作意向书
2015/05/08 职场文书
六一儿童节致辞
2015/07/31 职场文书
描述鲁迅的名言整理,一生受用
2019/08/08 职场文书
JavaScript嵌入百度地图API的最详细方法
2021/04/16 Javascript
JS 4个超级实用的小技巧 提升开发效率
2021/10/05 Javascript