总结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 原型与继承说明
Jun 09 Javascript
使用Jquery实现点击文字后变成文本框且可修改
Sep 21 Javascript
jquery实现手机发送验证码的倒计时代码
Feb 12 Javascript
js实现按钮加背景图片常用方法
Nov 01 Javascript
理解javascript回调函数
Dec 28 Javascript
JavaScript函数详解
Feb 27 Javascript
jquery合并表格中相同文本的相邻单元格
Jul 17 Javascript
js鼠标点击图片切换效果代码分享
Aug 26 Javascript
第九篇Bootstrap导航菜单创建步骤详解
Jun 21 Javascript
js中getter和setter用法实例分析
Aug 14 Javascript
js指定日期增加指定月份的实现方法
Dec 19 Javascript
Vue.js中v-bind指令的用法介绍
Mar 13 Vue.js
实例代码讲解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与paypal整合方法
2010/11/28 PHP
php根据用户语言跳转相应网页
2015/11/04 PHP
PHP实现的蚂蚁爬杆路径算法代码
2015/12/03 PHP
thinkphp框架实现删除和批量删除
2016/06/29 PHP
PHP HTTP 认证实例详解
2016/11/03 PHP
利用javascript移动div层-javascript 拖动层
2009/03/22 Javascript
读jQuery之三(构建选择器)
2011/06/11 Javascript
浏览器兼容console对象的简要解决方案分享
2013/10/24 Javascript
js函数与php函数的区别实例浅析
2015/01/12 Javascript
浅谈JavaScript事件的属性列表
2015/03/01 Javascript
javascript中setInterval的用法
2015/07/19 Javascript
Jquery技巧(必须掌握)
2016/03/16 Javascript
javascript中json基础知识详解
2017/01/19 Javascript
JSON与js对象序列化实例详解
2017/03/16 Javascript
在JS中如何把毫秒转换成规定的日期时间格式实例
2017/05/11 Javascript
原生js+cookie实现购物车功能的方法分析
2017/12/21 Javascript
微信小程序用户信息encryptedData详解
2018/08/24 Javascript
详解如何在vue项目中使用lodop打印插件
2018/09/27 Javascript
angular6 利用 ngContentOutlet 实现组件位置交换(重排)
2018/11/02 Javascript
Vue 页面权限控制和登陆验证功能的实例代码
2019/06/20 Javascript
Vue使用Element实现增删改查+打包的步骤
2020/11/25 Vue.js
python中requests小技巧
2017/05/10 Python
Pyinstaller将py打包成exe的实例
2018/03/31 Python
django 外键model的互相读取方法
2018/12/15 Python
windows支持哪个版本的python
2020/07/03 Python
python 多线程共享全局变量的优劣
2020/09/24 Python
python 基于selectors库实现文件上传与下载
2020/12/31 Python
HTML5 canvas基本绘图之绘制线段
2016/06/27 HTML / CSS
生物技术专业毕业生求职信范文
2013/12/14 职场文书
中学家长会邀请函
2014/01/17 职场文书
自荐信写法介绍
2014/01/25 职场文书
网络研修心得体会
2016/01/08 职场文书
关于JavaScript回调函数的深入理解
2021/06/27 Javascript
详解使用内网穿透工具Ngrok代理本地服务
2022/03/31 Servers
vue项目如何打包之项目打包优化(让打包的js文件变小)
2022/04/30 Vue.js
python如何为list实现find方法
2022/05/30 Python