总结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 纠正 cleanWhitespace函数
Mar 11 Javascript
ASP.NET jQuery 实例15 通过控件CustomValidator验证CheckBoxList
Feb 03 Javascript
js实现上传图片预览的方法
Feb 09 Javascript
javascript实现九宫格相加数值相等
May 28 Javascript
AngularJs concepts详解及示例代码
Sep 01 Javascript
javascript轮播图算法
Oct 21 Javascript
Map.vue基于百度地图组件重构笔记分享
Apr 17 Javascript
fetch 使用及如何接收JS传值
Nov 11 Javascript
webpack学习教程之前端性能优化总结
Dec 05 Javascript
详解vue-cli项目开发/生产环境代理实现跨域请求
Jul 23 Javascript
在Vue 中获取下拉框的文本及选项值操作
Aug 13 Javascript
node.js使用express-fileupload中间件实现文件上传
Jul 16 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
动漫女神老婆无限好,但日本女生可能就不是这么一回事了!
2020/03/04 日漫
PHP定时执行任务的3种方法详解
2015/12/21 PHP
PHP使用ajax的post方式下载excel文件简单示例
2019/08/06 PHP
js滚动条多种样式,推荐
2007/02/05 Javascript
如何用js控制css中的float的代码
2007/08/16 Javascript
javascript 学习之旅 (3)
2009/02/05 Javascript
jQuery AnythingSlider滑动效果插件
2010/02/07 Javascript
Jquery插件之多图片异步上传
2010/10/20 Javascript
innerText 使用示例
2014/01/23 Javascript
nodejs文件操作模块FS(File System)常用函数简明总结
2014/06/05 NodeJs
jquery实现用户打分评分特效
2015/05/28 Javascript
Javascript简单改变表单元素背景的方法
2015/07/15 Javascript
基于jquery实现轮播焦点图插件
2016/03/31 Javascript
详解js中==与===的区别
2017/01/08 Javascript
jQuery插件jqGrid动态获取列和列字段的方法
2017/03/03 Javascript
详解Angular2 之 结构型指令
2017/06/21 Javascript
NodeJs 文件系统操作模块fs使用方法详解
2018/11/26 NodeJs
Vue axios 跨域请求无法带上cookie的解决
2020/09/08 Javascript
vue项目查看vue版本及cli版本的实现方式
2020/10/24 Javascript
原生js实现简单轮播图
2020/10/26 Javascript
[46:00]Ti4 冒泡赛第二轮LGD vs C9 2
2014/07/14 DOTA
[52:10]LGD vs Optic Supermajor小组赛D组胜者组决赛 BO3 第二场 6.3
2018/06/04 DOTA
Python编程判断这天是这一年第几天的方法示例
2017/04/18 Python
Kali Linux安装ipython2 和 ipython3的方法
2019/07/11 Python
Django之使用celery和NGINX生成静态页面实现性能优化
2019/10/08 Python
Django框架下静态模板的继承操作示例
2019/11/08 Python
Tensorflow实现在训练好的模型上进行测试
2020/01/20 Python
基于Python实现体育彩票选号器功能代码实例
2020/09/16 Python
CSS3动画之流彩文字效果+图片模糊效果+边框伸展效果实现代码合集
2017/08/18 HTML / CSS
网购亚洲时装、美容产品和生活百货:YesStyle
2016/09/15 全球购物
The Kooples美国官方网站:为情侣提供的法国当代时尚品牌
2019/01/03 全球购物
汽车运用工程系毕业生自荐信
2013/12/27 职场文书
保险公司早会主持词
2014/03/22 职场文书
争做文明公民倡议书
2014/08/29 职场文书
酒店保洁员岗位职责
2015/02/26 职场文书
HTML中link标签属性的具体用法
2023/05/07 HTML / CSS