先从两个问题看起:

第一个问题 为什么 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. awk进阶整理

    BEGIN{写在前言,我英语不好,有许多地方直接使用的谷歌翻译.为了能理清awk工具使用的思路,详情还要看awk说明书(man awk) 或者http://www.gnu.org/software/g ...

  2. 【转】shell脚本实现多台服务器自动巡检--可参考学习

    shell脚本实现多台服务器自动巡检   摘要:           运维服务一个项目二十多台(或者多台)服务器,每天要做服务器的性能巡检工作是查看服务器的CPU.内存.磁盘空间是否在正常值范围内.像 ...

  3. 【转】Linux Oracle服务启动&停止脚本与开机自启动

    在CentOS 6.3下安装完Oracle 10g R2,重开机之后,你会发现Oracle没有自行启动,这是正常的,因为在Linux下安装Oracle的确不会自行启动,必须要自行设置相关参数,首先先介 ...

  4. Electron应用使用electron-builder配合electron-updater实现自动更新(windows + mac)

    发客户端一定要做的就是自动更新模块,否则每次版本升级都是一个头疼的事.下面是Electron应用使用electron-builder配合electron-updater实现自动更新的解决方案. 1.安 ...

  5. FTP工具

    上传本地资源到FTP服务器,可以使用LeapFTP软件.左侧为本地资源,右侧为FTP资源.输入用户名,密码,连接后直接拖动即可. 为本地资源建立FTP,可以方便进行设备升级.文件传输等.

  6. python基础 列表 的使用

    列表 首先定义一个列表 声明列表 列表名字=[值1,值2] list=[1,2,3,4,5] 这是一个列表,列表中有五个元素(1,2,3,4,5) 显示list列表 print   list 输出   ...

  7. 整理一点与排列组合有关的问题[组合数 Stirling数 Catalan数]

    都是数学题 思维最重要,什么什么数都没用,DP直接乱搞(雾.. 参考LH课件,以及资料:http://daybreakcx.is-programmer.com/posts/17315.html 做到有 ...

  8. IT连创业系列:年终回顾录!

    一年不过一转眼,一光阴的青春又逝去了! 还有不到几天,就要进入新年快乐的祝福包围圈了. 在这归家之际,留文一篇,为这忙碌的一年创业留点回忆! IT连创业这一年走来: 大大小小的深坑,小小大大的困难,一 ...

  9. wenpack-simple+elementUI配置

    首先跟着element官方文档走一遍 注意把.babelrc改成这样 { "presets": [ ["env", { "modules": ...

  10. Jmeter_实现操作postgresql数据库

    [环境] ①Jmeter版本:3.2,JDK:1.8: ②postgresql驱动包postgresql-9.3-1103.jdbc4,将该jar包置于..\apache-jmeter-3.2\lib ...