当前位置: 首页 > news >正文

js中的 || 与 运算符详解

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

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结果值

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

例如

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

 

相关文章:

  • js中的prototype、__proto__与constructor
  • js Object方法大全
  • Vuex的五个核心概念
  • Javascript的5种基本数据类型总结
  • “use strict” 严格模式使用
  • NPM简介
  • powershell
  • webpack原理探究 打包优化
  • Webpack模块的导出以及之间的依赖引用
  • javascript中的原型与原型链
  • Javascript定义类(class)的三种方法
  • ES6 Promise用法小结
  • JavaScript类继承
  • javascript中call()、apply()、bind()的用法终于理解
  • PHP常用开发工具
  • .pyc 想到的一些问题
  • 2017 年终总结 —— 在路上
  • download使用浅析
  • Javascripit类型转换比较那点事儿,双等号(==)
  • log4j2输出到kafka
  • node入门
  • SpiderData 2019年2月25日 DApp数据排行榜
  • Spring-boot 启动时碰到的错误
  • vue 配置sass、scss全局变量
  • 搭建gitbook 和 访问权限认证
  • 解析 Webpack中import、require、按需加载的执行过程
  • 扑朔迷离的属性和特性【彻底弄清】
  • 前嗅ForeSpider教程:创建模板
  • 实战:基于Spring Boot快速开发RESTful风格API接口
  • 通过npm或yarn自动生成vue组件
  • 在 Chrome DevTools 中调试 JavaScript 入门
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • #大学#套接字
  • #我与Java虚拟机的故事#连载14:挑战高薪面试必看
  • (16)Reactor的测试——响应式Spring的道法术器
  • (C#)获取字符编码的类
  • (TipsTricks)用客户端模板精简JavaScript代码
  • (附源码)springboot 个人网页的网站 毕业设计031623
  • (论文阅读40-45)图像描述1
  • (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间...
  • (三)Pytorch快速搭建卷积神经网络模型实现手写数字识别(代码+详细注解)
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (转)IIS6 ASP 0251超过响应缓冲区限制错误的解决方法
  • (转)winform之ListView
  • (转载)Google Chrome调试JS
  • *Algs4-1.5.25随机网格的倍率测试-(未读懂题)
  • .NET CF命令行调试器MDbg入门(一)
  • .net CHARTING图表控件下载地址
  • .net 受管制代码
  • .net 提取注释生成API文档 帮助文档
  • .NET 中 GetProcess 相关方法的性能
  • .net解析传过来的xml_DOM4J解析XML文件
  • @FeignClient注解,fallback和fallbackFactory
  • @SpringBootApplication 包含的三个注解及其含义
  • []新浪博客如何插入代码(其他博客应该也可以)