js中的 || 与 && 运算符详解


Posted in Javascript onMay 24, 2018

js中逻辑运算符在开发中可以算是比较常见的运算符了,主要有三种:逻辑与&&、逻辑或||和逻辑非!。

当&&和|| 连接语句时,两边的语句会转化为布尔类型(Boolean),然后再进行运算,具体的运算规则如下:

1.&&

1.1两边条件都为true时,结果才为true;
1.2如果有一个为false,结果就为false;
1.3当第一个条件为false时,就不再判断后面的条件

注意:当数值参与逻辑与运算时,结果为true,那么会返回的会是第二个为真的值;如果结果为false,返回的会是第一个为假的值。

2.||

2.1只要有一个条件为true时,结果就为true;
2.2当两个条件都为false时,结果才为false;
2.3当一个条件为true时,后面的条件不再判断

注意:当数值参与逻辑或运算时,结果为true,会返回第一个为真的值;如果结果为false,会返回第二个为假的值;

3.!

3.1当条件为false时,结果为true;反之亦然。

上代码说明:

<!DOCTYPE html> 
<html lang="en"> 
<head> 
  <meta charset="UTF-8"> 
  <title>demo</title> 
  <script> 
    console.log( 5 && 4 );//当结果为真时,返回第二个为真的值4 
    console.log( 0 && 4 );//当结果为假时,返回第一个为假的值0 
    console.log( 5 || 4 );//当结果为真时,返回第一个为真的值5 
    console.log( 0 || 0 );//当结果为假时,返回第二个为假的值0 
    console.log((3||2)&&(5||0));//5 
    console.log(!5);//false 
  </script> 
</head> 
<body> 
 
</body> 
</html>

补充:逻辑与的优先级是高于逻辑或的;

比如console.log(3||2&&5||0),会先算2&&5的值为5,然后再3||5----3,最后再3||0----3,所以最终结果为3.

补充

表达式a && 表达式b :  计算表达式a(也可以是函数)的运算结果,
                      如果为 True, 执行表达式b(或函数),并返回b的结果;
                      如果为 False,返回a的结果;

表达式a || 表达式b :   计算表达式a(也可以是函数)的运算结果,
                      如果为 Fasle, 执行表达式b(或函数),并返回b的结果;
                      如果为 True,返回a的结果;

转换规则:

对象为true;
非零数字为true;

零为false;

非空字符串为true;
空字符串为法false;
其他为false;

例如:
var  a =  obj || " "  ;     //如果 obj 为空,a就赋值为 " " ;
var  a = check() &&  do();    //如果check()返回为真,就执行do(),并将结果赋值给 a;

其他网友的补充

今天复习js继承的时候发现了一个问题,先上代码了

<script type="text/javascript">
 window.onload = function () {
  var mama,
  mama1,
  test = function (name) {
  debugger;
  this.name = name || 'mama';
  };
  debugger;
  mama = new test();
  mama1 = new test("mama1");
  alert(mama.name);//name = mama
  alert(mama1.name);// name = mama1
 }

 </script>

在执行构造函数的时候,无参的构造函数返回的name是'mama',有参数时,实例的name就是参数值了。
这个时候我就有点犯迷糊了,为什么逻辑运算符||能这么用呢?
由于是C#出身,所以对js ||这样用感觉很奇怪。
没辙,不懂先研究,实验实验就知道了。

var b, c, d;
  b = true || 0;//b=true;
  c = false || 0;//c=0;
  d = 1 || 0;//d=1;

换成别的呢?

var b, c, d;
  b = 1-1 || 1+1; //b=2
  c = function () { return undefined } || function () { return 1};//c=function();
  d = c();//d=undefined
var b, c, d;
  b = 1-1 || 1+1; //b=2
  c = function () { return 1 } || function () { return undefined};//c=function();
  d = c();//d=1
b = {} || { a: 1, getA: function () { return this.a}}; //b=object

js中的 || 与 &amp;&amp; 运算符详解

var b, c, d;
  b = { a: 1, getA: function () { return this.a } } || {}; //b=object
  c = b.getA();//c=1;

通过这几个实验,可以看出,JS的||并不是像C#里面的||一样 单纯的返回一个布尔类型。
大家都知道js的布尔类型判定是对象是true,非零是true,非空字符串是true其余的都是false

 由此得出
逻辑或 ||  : var a = 表达式1 || 表达式2

表达式1

表达式2

a取值

  1   

0

表达式1结果值

  1

  1

表达式1结果值

  0

  1

表达式2结果值

  0

  0

表达式2结果值
 

逻辑与 &&  : var a = 表达式1 && 表达式2

表达式1

表达式2

a取值

  1   

0

表达式2结果值

  1

  1

表达式2结果值

  0

  1

表达式1结果值

  0

  0

表达式1结果值

主要原因是因为短路,逻辑或 || 在前面有一个ture的时候则不看后面直接停止,逻辑与&&同理。
然后计算赋值和我们平时一样之获取最新的一次计算结果值。

例如

b = (1 + 1, 2 + 2, 3 + 3);//b=6;

嘛嘛,当然只是猜测。
以上仅供参考。萌新一只,望各位大佬轻批。

Javascript 相关文章推荐
神奇的代码 通杀各种网站-可随意修改复制页面内容
Jul 17 Javascript
JavaScript 保存数组到Cookie的代码
Apr 14 Javascript
js对象的比较
Feb 26 Javascript
JavaScript模拟实现继承的方法
Mar 30 Javascript
js仿苹果iwatch外观的计时器代码分享
Aug 26 Javascript
10分钟掌握XML、JSON及其解析
Dec 06 Javascript
JavaScript数据结构之二叉树的遍历算法示例
Apr 13 Javascript
Express框架之connect-flash详解
May 31 Javascript
ES6学习教程之Map的常用方法总结
Aug 03 Javascript
微信小程序学习笔记之本地数据缓存功能详解
Mar 29 Javascript
详解vue的双向绑定原理及实现
May 05 Javascript
jQuery 函数实例分析【函数声明、函数表达式、匿名函数等】
May 19 jQuery
vue axios整合使用全攻略
May 24 #Javascript
vue路由拦截及页面跳转的设置方法
May 24 #Javascript
使用Vue自定义指令实现Select组件
May 24 #Javascript
详解Vue单元测试case写法
May 24 #Javascript
微信小程序通过保存图片分享到朋友圈功能
May 24 #Javascript
karma+webpack搭建vue单元测试环境的方法示例
May 24 #Javascript
react实现点击选中的li高亮的示例代码
May 24 #Javascript
You might like
PHP 采集程序原理分析篇
2010/03/05 PHP
php的字符串用法小结
2010/06/08 PHP
用PHP将数据导入到Foxmail的实现代码
2010/09/05 PHP
PHP上传图片进行等比缩放可增加水印功能
2014/01/13 PHP
Yii2.0实现的批量更新及批量插入功能示例
2019/01/29 PHP
jQueryUI的Dialog的简单封装
2010/06/07 Javascript
浅析showModalDialog数据缓存问题(用禁止浏览器缓存解决)
2013/07/09 Javascript
jquery下拉select控件操作方法分享(jquery操作select)
2014/03/25 Javascript
jQuery中:first-child选择器用法实例
2014/12/31 Javascript
JavaScript基本的输出和嵌入式写法教程
2015/10/20 Javascript
微信小程序 图片等比例缩放(图片自适应屏幕)
2016/11/16 Javascript
解决同一页面中两个iframe互相调用jquery,js函数的方法
2016/12/12 Javascript
微信小程序 常用工具类详解及实例
2017/02/15 Javascript
vue.js 获取当前自定义属性值
2017/06/01 Javascript
angular写一个列表的选择全选交互组件的示例
2018/01/22 Javascript
微信小程序画布圆形进度条显示效果
2020/11/17 Javascript
Bootstrap-table自定义可编辑每页显示记录数
2018/09/07 Javascript
关于AngularJS中ng-repeat不更新视图的解决方法
2018/09/30 Javascript
ES11屡试不爽的新特性,你用上了几个
2020/10/21 Javascript
微信小程序实现音乐播放页面布局
2020/12/11 Javascript
swiper实现导航滚动效果
2020/12/13 Javascript
python通过ElementTree操作XML获取结点读取属性美化XML
2013/12/02 Python
python判断字符串是否是json格式方法分享
2017/11/07 Python
Python输出各行命令详解
2018/02/01 Python
Python Pandas 箱线图的实现
2019/07/23 Python
python set集合使用方法解析
2019/11/05 Python
Python操作MySQL数据库实例详解【安装、连接、增删改查等】
2020/01/17 Python
解决keras使用cov1D函数的输入问题
2020/06/29 Python
python使用Word2Vec进行情感分析解析
2020/07/31 Python
CSS实现圆形放大镜狙击镜效果 只有圆圈里的放大
2012/12/10 HTML / CSS
Belvilla法国:休闲度假房屋出租
2020/10/03 全球购物
自动化专业个人求职信范文
2013/12/30 职场文书
2014爱耳日宣传教育活动总结
2014/03/09 职场文书
法律意见书范本
2015/06/04 职场文书
CocosCreator ScrollView优化系列之分帧加载
2021/04/14 Python
java设计模式--三种工厂模式详解
2021/07/21 Java/Android