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

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

【JavaScript】JavaScript赋值语句中的逻辑与&&和逻辑或||的更多相关文章

  1. Javascript模板及其中的数据逻辑分离思想(MVC)

    #Javascript模板及其中的数据逻辑分离思想 ##需求描述 项目数据库的题目表描述了70-120道题目,并且是会变化的,要根据数据库中的数据描述,比如,选择还是填空题,是不是重点题,题目总分是多 ...

  2. 仔细看看Javascript中的逻辑与(&&)和逻辑或(||)

    学过Java和C的人,都知道逻辑与(&&)和逻辑或(||),他们都是短路运算符,也就是说,对于&&来说,只要左边的操作数是false,它就不会再去判断右边的操作数是tr ...

  3. Javascript赋值语句中的“&&”操作符和"||"操作符

    有这么一种常见的语句: var a = a || 4; 那赋值语句中的"&&"操作符和"||"操作符是什么意思?如何知道这两个逻辑操作符两旁的数 ...

  4. 大型 JavaScript 应用架构中的模式

    原文:Patterns For Large-Scale JavaScript Application Architecture by @Addy Osmani 今天我们要讨论大型 JavaScript ...

  5. 细数Javascript技术栈中的四种依赖注入

    作为面向对象编程中实现控制反转(Inversion of Control,下文称IoC)最常见的技术手段之一,依赖注入(Dependency Injection,下文称DI)可谓在OOP编程中大行其道 ...

  6. [转]大型 JavaScript 应用架构中的模式

    目录 1.我是谁,以及我为什么写这个主题 2.可以用140个字概述这篇文章吗? 3.究竟什么是“大型”JavaScript应用程序? 4.让我们回顾一下当前的架构 5.想得长远一些 6.头脑风暴 7. ...

  7. JavaScript高级程序设计中第2、3章中细节知识点

    第2章 1.<script src='script.js' type='text/javascript'></script>中,只要不包含defer和async属性,浏览器都会 ...

  8. JavaScript从数组中删除指定值元素的方法

    本文实例讲述了JavaScript从数组中删除指定值元素的方法.分享给大家供大家参考.具体分析如下: 下面的代码使用了两种方式删除数组的元素,第一种定义一个单独的函数,第二种为Array对象定义了一个 ...

  9. JavaScript 在函数中使用Ajax获取的值作为函数的返回值

    解决:JavaScript 在函数中使用Ajax获取的值作为函数的返回值,结果无法获取到返回值 原因:ajax默认使用异步方式,要将异步改为同步方式 案例:通过区域ID,获取该区域下所有的学校 var ...

随机推荐

  1. luogu3327 [SDOI2015]约数个数和

    link 设\(d(x)\)表示x约数个数,给定n,m,\(\sum_{i=1}^n\sum_{j=1}^md(ij)\) 多组询问,1<=T<=50000,1<=N, M<= ...

  2. HDU6312 Game (多校第二场1004) 简单博弈

    Game Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  3. 查看详细linux系统信息的命令和方法

    查看内存大小: cat /proc/meminfo |grep MemTotaluname -a # 查看内核/操作系统/CPU信息的linux系统信息命令head -n 1 /etc/issue # ...

  4. spring中IOC容器注册和获取bean的实例

    spring中常用的功能主要的是ioc和aop,此处主要说明下,实例注册和使用的方法,此为学习后的笔记记录总结 1.使用xml文件配置 在idea中创建maven工程,然后创建实例Person,然后在 ...

  5. 3D电影转2D普通电影,电脑上看

    下了一些电影,打开发现是左右两个一样的画面,什么情况?原来这就是传说中的3D,怎么像正常电影一样的看呢?第一反应去搜3D眼镜,价钱倒是不贵,但是不应急呀,肿么办?以下是观看方法: 一.看电脑上有QQ影 ...

  6. tomcat的热部署配置

    1.什么是tomcat热部署? 所谓的tomcat热部署,就是在不重启tomcat服务器的前提下,将自己的项目部署到tomcat服务器中,这种方式是非常方便的,也称之为“开发即用”,热部署分为手动热部 ...

  7. bcb6重启应用程序

    在工程的cpp文件中WinMain还是得最后添加如下的代码(其中g_blsRunAgain为bool类型的全局变量,在需求重启的时候先将g_blsRunAgain置为true,再将程序关闭,之后就会重 ...

  8. Pandas基本功能详解

    Pandas基本功能详解 Pandas  Pandas基本功能详解 |轻松玩转Pandas(2) 参考:Pandas基本功能详解 |轻松玩转Pandas(2)

  9. windows_study_2

    描述:如何确定像%ProgramFiles%这样格式的目录的具体位置? 解决:运行——cmd——echo %ProgramFiles%——回车——界面就显示出目录位置了.

  10. linux 底层 基础命令 路径信息

    z基础命令: 打印 :echo "hello world“ 切换目录   cd  / 显示当前路径     pwd 显示 目录下所有文件     ls 显示所有文件包括隐藏文件    ls ...