总结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 相关文章推荐
JS延迟加载(setTimeout) JS最后加载
Jul 15 Javascript
Javascript 拖拽的一些简单的应用(逐行分析代码,让你轻松了拖拽的原理)
Jan 23 Javascript
jQuery过滤选择器用法分析
Feb 10 Javascript
JavaScript中将数组进行合并的基本方法讲解
Mar 07 Javascript
VueJS如何引入css或者less文件的一些坑
Apr 25 Javascript
详解在vue-cli项目中安装node-sass
Jun 21 Javascript
Three.js利用dat.GUI如何简化试验流程详解
Sep 26 Javascript
Vue组件中slot的用法
Jan 30 Javascript
JavaScript 变量,数据类型基础实例详解【变量、字符串、数组、对象等】
Jan 04 Javascript
Node.js API详解之 util模块用法实例分析
May 09 Javascript
纯JS开发baguetteBox.js响应式画廊插件
Jun 28 Javascript
解决vue安装less报错Failed to compile with 1 errors的问题
Oct 22 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
Discuz! Passport 通行证整合
2008/03/27 PHP
Zend Framework 2.0事件管理器(The EventManager)入门教程
2014/08/11 PHP
基于递归实现的php树形菜单代码
2014/11/19 PHP
php上传图片客户端和服务器端实现方法
2015/03/30 PHP
PHP 计算两个时间段之间交集的天数示例
2019/10/24 PHP
在网页中控制wmplayer播放器
2006/07/01 Javascript
SUN的《AJAX与J2EE》全文译了
2007/02/23 Javascript
百度留言本js 大家可以参考下
2009/10/13 Javascript
Extjs学习笔记之三 extjs form更多的表单项
2010/01/07 Javascript
javascript 获取网页标题代码实例
2014/01/22 Javascript
如何让你的Lightbox支持滚轮缩放及Base64图片
2014/12/04 Javascript
JavaScript中的方法重载实例
2015/03/16 Javascript
jquery插件pagination实现无刷新ajax分页
2015/09/30 Javascript
jquery跟随屏幕滚动效果的实现代码
2016/04/13 Javascript
AngularJS使用ng-Cloak阻止初始化闪烁问题的方法
2016/11/03 Javascript
微信小程序购物商城系统开发系列-工具篇的介绍
2016/11/21 Javascript
EasyUI学习之Combobox下拉列表(1)
2016/12/29 Javascript
AngularJS上传文件的示例代码
2018/11/10 Javascript
nuxt框架中对vuex进行模块化设置的实现方法
2019/09/06 Javascript
解决Vue使用bus总线时,第一次路由跳转时数据没成功传递问题
2020/07/28 Javascript
[46:00]Ti4 冒泡赛第二轮LGD vs C9 2
2014/07/14 DOTA
python每隔N秒运行指定函数的方法
2015/03/16 Python
Python3实现的Mysql数据库操作封装类
2018/06/06 Python
基于Python实现拆分和合并GIF动态图
2019/10/22 Python
python实现视频压缩功能
2020/12/18 Python
纯CSS3实现给头像加个光芒四射且旋转的背景动画效果
2014/05/07 HTML / CSS
CSS3下的渐变文字效果实现示例
2018/03/02 HTML / CSS
让IE支持HTML5的方法
2012/12/11 HTML / CSS
Otticanet美国:最顶尖的世界名牌眼镜, 能得到打折季的价格
2019/03/10 全球购物
“四风”问题自我剖析材料思想汇报
2014/09/23 职场文书
学生评语集锦
2015/01/04 职场文书
工程款申请报告
2015/05/15 职场文书
八月一日观后感
2015/06/10 职场文书
2015年征兵工作总结
2015/07/23 职场文书
初三语文教学反思
2016/03/03 职场文书
微信小程序 WeUI扩展组件库的入门教程
2022/04/21 Javascript