总结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 json 新手入门文档
Dec 03 Javascript
javascript实现的在当前窗口中漂浮框的代码
Mar 15 Javascript
JS 模态对话框和非模态对话框操作技巧汇总
Apr 15 Javascript
javascript 按键事件(兼容各浏览器)
Dec 20 Javascript
现如今最流行的JavaScript代码规范
Mar 08 Javascript
js实现的类似于asp数据字典的数据类型代码实例
Sep 03 Javascript
判断在css加载完毕后执行后续代码示例
Sep 03 Javascript
超详细的javascript数组方法汇总
Nov 21 Javascript
jQuery simplePage+AJAX plus分页插件用法实例
Feb 17 Javascript
Angular2 父子组件数据通信实例
Jun 22 Javascript
js中arguments对象的深入理解
May 14 Javascript
nuxt.js服务端渲染中axios和proxy代理的配置操作
Nov 06 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学习笔记 IIS7下安装配置php环境
2012/10/29 PHP
PHP文件上传、客户端和服务器端加限制、抓取错误信息、完整步骤解析
2017/01/12 PHP
PHP单例模式简单用法示例
2017/06/23 PHP
SharePoint 客户端对象模型 (一) ECMA Script
2011/05/22 Javascript
js实现单一html页面两套css切换代码
2013/04/11 Javascript
js的toLowerCase方法用法实例
2015/01/27 Javascript
完美解决IE不支持Data.parse()的问题
2016/11/24 Javascript
windows下vue-cli及webpack搭建安装环境
2017/04/25 Javascript
详解JS中的柯里化(currying)
2017/08/17 Javascript
vue2组件之select2调用的示例代码
2017/10/12 Javascript
浅谈如何通过node.js对数据进行MD5加密
2018/05/16 Javascript
Vue事件处理原理及过程详解
2020/03/11 Javascript
从Node.js事件触发器到Vue自定义事件的深入讲解
2020/06/26 Javascript
vue路由分文件拆分管理详解
2020/08/13 Javascript
[02:53]DOTA2英雄基础教程 山岭巨人小小
2013/12/09 DOTA
[04:44]显微镜下的DOTA2第二期——你所没有注意到的细节
2014/06/20 DOTA
[01:04:02]DOTA2-DPC中国联赛 正赛 Elephant vs IG BO3 第二场 1月24日
2021/03/11 DOTA
python 远程统计文件代码分享
2015/05/14 Python
Python判断Abundant Number的方法
2015/06/15 Python
python读取与写入csv格式文件的示例代码
2017/12/16 Python
python实现求最长回文子串长度
2018/01/22 Python
Python基于更相减损术实现求解最大公约数的方法
2018/04/04 Python
python判断完全平方数的方法
2018/11/13 Python
Python 3.3实现计算两个日期间隔秒数/天数的方法示例
2019/01/07 Python
TensorFLow 变量命名空间实例
2020/02/11 Python
python 伯努利分布详解
2020/02/25 Python
PyQt5实现仿QQ贴边隐藏功能的实例代码
2020/05/24 Python
用HTML5实现网站在windows8中贴靠的方法
2013/04/21 HTML / CSS
Html5踩坑记之mandMobile使用小记
2020/04/02 HTML / CSS
科室工作个人总结的自我评价
2013/10/29 职场文书
采购人员的个人自我评价
2014/01/16 职场文书
纠纷协议书
2014/04/16 职场文书
五一促销活动总结
2014/07/01 职场文书
房屋分割离婚协议书范本
2014/12/01 职场文书
学习杨善洲同志先进事迹心得体会
2016/01/23 职场文书
Mysql数据库表中为什么有索引却没有提高查询速度
2022/02/24 MySQL