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

【JavaScript】JavaScript赋值语句中的逻辑与和逻辑或||

在其他语言中,我们往往看到逻辑符号出现在判断语句当中,如

if(a||b){}  

但在一些js相关的面试题或者书中,我们有时会看到逻辑与&&和逻辑或||符号出现在赋值语句或者返回语句中,如

var x=a||b;
return a&&b||c;

第一次看到时,我们很可能一头雾水,这是怎么回事?

 

因为在js中允许使用表达式赋值,所得的值为该表达式的运算结果。如

var a= 5;  
var b= 6;  
var c= a+b;  
a= 10;  
console.log(c);//11  js是按顺序进行,之后的赋值不会影响之前已经计算后的表达式结果
var b= 6; 
var c= a+b; 
var a= 5; 
console.log(c);//NaN 
//js虽然是按顺序进行,但在js中变量声明会提前处理,赋值操作只有在进行到该赋值语句时才会执行,所以执行到var c= a+b;时,
a只定义未赋值。返回 not a num

 

我们知道,

逻辑与&&的运算规则:只有左右都是true时才为true,一边是false时就是false。

逻辑或 | | 的运算规则:只有左右都是false时才为false,一个为true时就是true。

 

那么,在赋值语句和返回语句中逻辑与&&和逻辑或||又是怎样呢?

赋予的和返回的值也不是判断得到的布尔值,而是运算符左右两旁某个表达式的运算结果。

对逻辑与&&来说:

当有一个false时,返回false一侧的值;

当有两个false时,返回运算符之前(左侧)的值;

当有两个true时,返回运算符之后(右侧)的值。

逻辑与&&运算属于短路运算,在按从左向右的运算顺序运算时,如果一个为假,即停止运算,并返回为假的值。如,

var a={};  
var b=56;  
//window.aaa为一个不存在的对象,  
console.log(window.aaa && null);   //undefined  
console.log(null && window.aaa);   //null  
console.log(a && null);                //null  
console.log(window.aaa&& a);      //undefined  
console.log(a && b);                   //56  
console.log(b && a);                   //object {}  

 

对逻辑或 | | 来说,正好同逻辑与&&相反:

当有一个true时,返回true一侧的值;

当有两个true时,返回运算符之前(左侧)的值;

当有两个false时,返回运算符之后(右侧)的值。

逻辑或 | | 运算也属于短路运算,在按从左向右的运算顺序运算时,只有第一个操作数为假,才进行第二个操作数,返回停止运算一侧的值,如

var a={};  
var b=56;  
console.log(window.aaa || null);   //null 
console.log(null || window.aaa);   //window.aaa 
console.log(a || null);                //object {} 
console.log(window.aaa|| a);      //object {}
console.log(a || b);                   //object {}  
console.log(b || a);                   //56 

 

转载于:https://www.cnblogs.com/lemonade1172/p/7388638.html

相关文章:

  • NS3网络仿真(10): 解析以太网帧
  • Redis API 必杀解读:引入RedisTemplate
  • 第十五 jQuery
  • 设置防火墙使mysql可以远程连接的方法
  • 【转】mysql explain执行计划详解
  • iOS平台设置系统状态栏(通知栏、顶部状态栏)样式背景颜色或透明
  • AngularJs工具方法
  • 线上 python http server profile 实践
  • 关于Unity中如何立即中断动画然后重新开始播放
  • windows下安装bpython方法 (新)
  • 为tomcat配置项目必须的引擎文件
  • ORACLE in与exists语句的区别
  • HDU 6170 - Two strings | 2017 ZJUT Multi-University Training 9
  • WebLogic 10.3.6与JDK 1.7的兼容问题
  • vnx通过iscsi连接esxi主机,并挂载nfs和block
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • 30天自制操作系统-2
  • 5、React组件事件详解
  • extjs4学习之配置
  • iOS编译提示和导航提示
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • Quartz初级教程
  • Solarized Scheme
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • webpack入门学习手记(二)
  • windows下如何用phpstorm同步测试服务器
  • 记一次用 NodeJs 实现模拟登录的思路
  • 解决jsp引用其他项目时出现的 cannot be resolved to a type错误
  • 坑!为什么View.startAnimation不起作用?
  • 七牛云假注销小指南
  • 入口文件开始,分析Vue源码实现
  • 使用前端开发工具包WijmoJS - 创建自定义DropDownTree控件(包含源代码)
  • 最简单的无缝轮播
  • Oracle Portal 11g Diagnostics using Remote Diagnostic Agent (RDA) [ID 1059805.
  • elasticsearch-head插件安装
  • ​HTTP与HTTPS:网络通信的安全卫士
  • #pragma once
  • #数学建模# 线性规划问题的Matlab求解
  • (003)SlickEdit Unity的补全
  • (1)虚拟机的安装与使用,linux系统安装
  • (31)对象的克隆
  • (附源码)spring boot建达集团公司平台 毕业设计 141538
  • (三)docker:Dockerfile构建容器运行jar包
  • (顺序)容器的好伴侣 --- 容器适配器
  • (转)http-server应用
  • (转载)深入super,看Python如何解决钻石继承难题
  • ../depcomp: line 571: exec: g++: not found
  • .describe() python_Python-Win32com-Excel
  • .NET 8.0 发布到 IIS
  • .net websocket 获取http登录的用户_如何解密浏览器的登录密码?获取浏览器内用户信息?...
  • .net 反编译_.net反编译的相关问题
  • .net 前台table如何加一列下拉框_如何用Word编辑参考文献
  • .NET4.0并行计算技术基础(1)