先从两个问题看起:

第一个问题 为什么 a && b 返回的是true,b && a 返回的是6

 var user = 6;
var both = true; console.log( user && both); //true
console.log( both && user); //

第二个问题 both进行自减  最后打印的依旧是3

 var user = false;
var both = 3; console.log( user && both--); // false
console.log(both); //
 

先从三个层次来理解(以&&为例说明):

第一层理解:操作数都是布尔值的时候,只有二者都为true的时候,结果才为true,否则为false。

第二层理解:&&可以对真值和假值进行运算,如果两个都是真值,则返回一个真值,否则返回一个假值。但是,真值并不仅限于true,假值也并不仅限于false,下面这些值会被转换成false(其他所有值都为true)

undefined

null

0/-0

NaN

" "

在js中,进行&&操作,结果并不总是true和false,而是当前的值。当前的值有可能就是数值、字符串等。

如果第一个表达式为真,那么就以第二个表达式的值作为其结果,这个结果不是转换之后的值,而是它本身。

如果第一个表达式为假,那么就以第一个表达式的值作为其结果,这个结果不是转换之后的值,而是它本身。

  //上面第一个问题

1 var user = 6;
var both = true;
var math = 0;
console.log( user && both); //true
console.log( both && user); //
console.log( both && math); //
console.log( math && both); //

第三层理解:短路运算,运算过程,首先计算左操作数的值,如果计算结果为假值,则整个表达式结果就为假值,也就是左操作数的值 同时停止右操作数的求值。如果左操作数的结果为真值,则整个结果依赖于右操作数的值。

关于短路运算的说明:

在&&和||运算时,如果第一个表达式的值就已经能够确定整个运算的结果,那么第二个表达式将不会执行

对于&&操作而言 第一个表达式的值为假值 那就决定了整个运算结果为假值 所以第一个表达式不会执行 所以y-- 并没有执行 y的值仍是3

  //上面第二个问题

1 var x = false;
var y = 3;
console.log(x && y--); // false
console.log(y); //

对于||而言,

如果第一个表达式的值为真值,结果就是第一个表达式的值,不是转换之后的,而是它本身。

如果第一个表达式的值为假值,结果就是第二个表达式的值,不是转换之后的,而是它本身。

 
 var user = true;
var both = 10; console.log(user || ++both); //true
console.log(both); //

&& 与 || 具有完全相同的原理,只是运算规则不太一样。

 var a = 10;
var b = true;
var c = 0; console.log(a || b); //
console.log(b || a); //true console.log(b || c); //true
console.log(c || b); //true

javascript-深入理解&&和||的更多相关文章

  1. Javascript中理解发布--订阅模式

    Javascript中理解发布--订阅模式 阅读目录 发布订阅模式介绍 如何实现发布--订阅模式? 发布---订阅模式的代码封装 如何取消订阅事件? 全局--发布订阅对象代码封装 理解模块间通信 回到 ...

  2. 第一百二十九节,JavaScript,理解JavaScript库

    JavaScript,理解JavaScript库 学习要点: 1.项目介绍 2.理解JavaScript库 3.创建基础库 从本章,我们来用之前的基础知识来写一个项目,用以巩固之前所学.那么,每个项目 ...

  3. 《javascript个人理解,个人整理。》

    万事开头难. 本人做前端工程师,已几年,没有特别大的,已文字方式去做总结. 前段时间,早已经想好,但是迟迟没有去下笔!好在现在陆陆续续的写下去. 我知道这是一个很大的工程,但是我还是想做下去,不为别的 ...

  4. 【转】Javascript中理解发布--订阅模式

    Javascript中理解发布--订阅模式 阅读目录 发布订阅模式介绍 发布---订阅模式又叫观察者模式,它定义了对象间的一种一对多的关系,让多个观察者对象同时监听某一个主题对象,当一个对象发生改变时 ...

  5. JavaScript深入理解sort()方法

    一. 基本用法 let arr1 = [3, 5, 7, 1, 8, 7, 10, 20, 19] console.log(arr1.sort()) // [1, 10, 19, 20, 3, 5, ...

  6. javascript深入理解js闭包(转)

    javascript深入理解js闭包 转载  2010-07-03   作者:    我要评论 闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. ...

  7. javascript的理解及经典案例

    js的简介: JavaScript是一种能让你的网页更加生动活泼的程式语言,也是目前网页中设计中最容易学又最方便的语言. 你可以利用JavaScript轻易的做出亲切的欢迎讯息.漂亮的数字钟.有广告效 ...

  8. javascript深入理解js闭包

    一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量 ...

  9. 悟透JavaScript(理解JS面向对象的好文章)

    引子 编程世界里只存在两种基本元素,一个是数据,一个是代码.编程世界就是在数据和代码千丝万缕的纠缠中呈现出无限的生机和活力. 数据天生就是文静的,总想保持自己固有的本色:而代码却天生活泼,总想改变这个 ...

  10. JavaScript闭包理解【关键字:普通函数、闭包、解决获取元素标签索引】

    以前总觉得闭包很抽象,很难理解,所以百度一下"闭包"概览,百度的解释是:“闭包是指可以包含自由(未绑定到特定对象)变量的代码块:这些变量不是在这个代码块内或者任何全局上下文中定义的 ...

随机推荐

  1. NoSQL在大数据中的应用

    一.序言 NoSQL是Not Only SQL的缩写,而不是Not SQL,指的是非关系型的数据库,它不一定遵循传统数据库的一些基本要求,比如说遵循SQL标准.ACID属性.表结构等等.相比传统数据库 ...

  2. VBoxManage命令速记

    1.IDE控制器创建:VBoxManage storagectl testvm --name "IDE Controller" --add ide卸载VBoxManage stor ...

  3. vue项目实现记住密码到cookie功能(附源码)

    实现功能: 1.记住密码勾选,点登陆时,将账号和密码保存到cookie,下次登陆自动显示到表单内 2.不勾选,点登陆时候则清空之前保存到cookie的值,下次登陆需要手动输入 大体思路就是通过存/取/ ...

  4. iOS-打电话、发短信、发邮件【指定QQ用户发送QQ消息】

    1.发短信 头文件 #import <MessageUI/MessageUI.h> 头部代理 @interface ViewController ()<MFMessageCompos ...

  5. ABP官方文档翻译 6.7 CSRF/XSRF保护

    CSRF/XSRF保护 介绍 HTTP动词 非浏览器客户端 ASP.NET MVC 特征 集成 布局视图 配置 ASP.NET Web API 特征 集成 集成到ASP.NET MVC客户端 集成到其 ...

  6. Matplotlib快速入门笔记

    我正以Python作为突破口,入门机器学习相关知识.出于机器学习实践过程中的需要,快速了解了一下matplotlib绘图库.下图是我学习过程中整理的一些概念. 本文将以该图为线索梳理相关概念. 简介 ...

  7. HBase Filter及对应Shell--转

    http://www.cnblogs.com/skyl/p/4807793.html 比较运算符 CompareFilter.CompareOp比较运算符用于定义比较关系,可以有以下几类值供选择: E ...

  8. C语言深度剖析-笔记

    关键字: C语言关键字32个: 关键字                                         意 义 auto                           声明自动变 ...

  9. DaemonSet 典型应用场景 - 每天5分钟玩转 Docker 容器技术(129)

    Deployment 部署的副本 Pod 会分布在各个 Node 上,每个 Node 都可能运行好几个副本.DaemonSet 的不同之处在于:每个 Node 上最多只能运行一个副本. DaemonS ...

  10. WebSocket就是这么简单

    前言 今天在慕课网上看到了Java的新教程(Netty入门之WebSocket初体验):https://www.imooc.com/learn/941 WebSocket我是听得很多,没有真正使用过的 ...