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

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. Jmeter解决乱码问题

    一.设置编码方式utf-8并勾选编码 适用场景:参数中含有中文或乱码 二.增加beanshell脚本 添加BeanShell PostProcessor或者BeanShell Sampler,输入代码 ...

  2. 查看和导入证书(.cer / .pfx)

    作为文件形式存在的证书一般有这几种格式: 1.带有私钥的证书 由Public Key Cryptography Standards #12,PKCS#12标准定义,包含了公钥和私钥的二进制格式的证书形 ...

  3. CSS趣味

    谈一下小技巧: 1.先看一下问题,实现下图,只用于一个html元素有多少种实现方式? 假设我们的单标签是一个 div: <div></div> 定义如下通用CSS: div{ ...

  4. Java中的两个类:Desktop和SystemTray

    在JDK6中 ,AWT新增加了两个类:Desktop和SystemTray,前者可以用来打开系统默认浏览器浏览指定的URL,打开系统默认邮件客户端给指定的邮箱发邮件,用默认应用程序打开或编辑文件(比如 ...

  5. rest_framework 的验证,权限,频率

    回到顶部 快速实例 Quickstart 回到顶部 序列化 创建一个序列化类 简单使用 开发我们的Web API的第一件事是为我们的Web API提供一种将代码片段实例序列化和反序列化为诸如json之 ...

  6. Go语言基础之11--Goroutine

    一.创建goroutine 1)在go语言中,每一个并发的执行单元叫做一个goroutine: 2)当一个程序启动时,其主函数即在一个单独的goroutine中运行,一般这个goroutine是主go ...

  7. Java字符串拆分和字符串连接

    Java字符串拆分/连接 public class LierString{ //------------------------------------------------------------ ...

  8. thinkPHP5.0使用form表单提交数据和删除文章,不用TP的提示页面,使用弹出提示信息

    form表单提交数据和删除文章时,TP的默认信息提示页面的看起来不是很好看,想要实现弹窗提示怎么做呢? 前端:可以使用前端的一个知识--iframe,iframe元素会创建包含另外一个文档的内联框架: ...

  9. PHP、thinkPHP5.0开发网站文件管理功能(三)重命名文件

    public function renames(){ if(request()->isAjax()){ $file = iconv('UTF-8','GB2312',urldecode(inpu ...

  10. Javascript各种事件汇总

    https://www.cnblogs.com/diligenceday/p/4190173.html#undefined https://www.cnblogs.com/starof/p/40663 ...