原生JS | 逻辑操作符的短路问题

HTML5学堂-码匠:短路,并不仅仅存在于物理学当中,JavaScript中的逻辑操作符也有短路问题,这个问题时常作为前端的考点出现哦!

面试真题

var a = 1, b = 0, c = 'HTML5学堂';
a || b && (c = '码匠');
console.log(c);
var a = 1, b = 0, c = 'HTML5学堂';
(a || b) && (c = '码匠');
console.log(c);

案例来源于某大型互联网公司的面试真题

考查的主要知识为“操作符的运算顺序”、“赋值操作符”以及“逻辑操作符的短路问题”。

运行结果:

'HTML5学堂'

'码匠'

逻辑操作符的短路问题

短路问题

短路问题,主要出现在逻辑与、逻辑或这两个操作符当中。

逻辑与( && )

当逻辑与(&&)前面是0(false)时,&&后面的表达式并不会执行。

逻辑或( || )

当逻辑或(||)前面的表达式结果“非0”(真)时,||符号后面的表达式并不会执行。

案例分析

var a = 1, b = 0, c = 'HTML5学堂';
a || b && (c = '码匠');
console.log(c);

案例解析:

a || b && (c='码匠');

该表达式当中有“逻辑与”和“逻辑或”这两种操作符,逻辑与的优先级要优于逻辑或,因此该表达式,等价于 a || ( b && (c=‘码匠’))。

由于a的值为1,在布尔值当中会被转换为true,对于逻辑或(||),一真必真,当第一个表达式为真时,第二个表达式就不再执行了,因此并没有执行(b&& (c='码匠'))这句代码,c也就没有被赋值了。

var a = 1, b = 0, c = 'HTML5学堂';
(a || b) && (c = '码匠');
console.log(c);

案例解析:

(a || b) && (c='码匠');

该表达式,先计算(a || b),该表达式的结果为true,对于逻辑与(&&)来说,只有两个表达式均为真,最终结果才能够为真。因此,当第一个表达式为真时,需要进行第二个表达式的执行。

因此,c='码匠';会被执行,c也被赋值为'码匠'。

相关案例练习

可以尝试以下案例,加强或测试一下自己的知识。

习题1

var a = 4, b = 3;

c = (a < b) && (a = 5);

console.log(a);

习题2

var a = 2, b = 3;

c = (a < b) || (a = 5);

console.log(a);

参考答案

习题1 运行结果:

4

习题2运行结果:

2

相关知识说明

操作符优先级(由高到低)

逻辑非

前置递增和前置递减

算术操作符

关系操作符

逻辑与 逻辑或

条件操作符

赋值操作符

原文发布于微信公众号 - HTML5学堂(h5course-com)

原文发表时间:2017-05-10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Fundebug

26个精选的JavaScript面试问题

为了保证可读性,本文采用意译而非直译。另外,本文版权归原作者所有,翻译仅用于学习。

873
来自专栏编程之旅

数据结构——无权图的路径问题(C++和java实现)

好像又是接近半个月没有更新,这半个月忙着结婚的各项事情,本来预计的学习任务也拖拖拉拉,进度缓慢。吐槽一句,拍婚纱照真的是最非常非常累的一件事情,不想再有下次了。

812
来自专栏吴裕超

js中三目运算符和&& || 符的个人浅见

这两天看到别人写的代码,感觉很牛逼,如下,大神请忽视 $(".lgn").on("click", function() { var a = {}...

3647
来自专栏菜鸟前端工程师

JavaScript学习笔记006-作用域0类型转换

682
来自专栏数说工作室

统计师的Python日记【第九天:正则表达式】

本文是【统计师的Python日记】第9天的日记 回顾一下: 第1天学习了Python的基本页面、操作,以及几种主要的容器类型。 第2天学习了python的函数、...

4174
来自专栏LinkedBear的个人空间

【挑战剑指offer】系列01:二维数组的查找

本系列的算法原题来自于“牛客网-剑指offer”,写这个板块,不仅仅是解决算法问题本身,更是手动提高难度、自行变式,思考更多的解决方案,以带给自己一些启发。

744
来自专栏顶级程序员

Python 工匠:编写条件分支代码的技巧

我一直觉得编程某种意义上是一门『手艺』,因为优雅而高效的代码,就如同完美的手工艺品一样让人赏心悦目。

652
来自专栏阿凯的Excel

Excel的匹配函数全应用

今天会和大家分享日常使用频率最高匹配函数用法,谈到匹配函数,首先想到的就是Vlookup,嗯,今天就是要分享Vlookup和他的小伙伴们的应用。 ? ...

3064
来自专栏工科狗和生物喵

【计算机本科补全计划】C++ Primer 第二章 【变量和基本类型】

正文之前 C++的数据类型包括 算术类型(int double等)和空类型(void),今天发生了一些很可怕的事情,详情请看正文之后!!我好害怕!! 正文 1、...

37411
来自专栏屈定‘s Blog

算法回顾--如何写递归?

总之递归就是”装傻”的把原始的思路表现出来,不需要关心具体过程,只需要不停的缩小问题规模,然后答案自然就会被计算出来.

912

扫码关注云+社区