原生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 条评论
登录 后参与评论

相关文章

来自专栏Crossin的编程教室

【Python 第22课】 函数应用示例

前两课稍稍介绍了一下函数,但光说概念还是有些抽象了,今天就来把之前那个小游戏用函数改写一下。 我希望有这样一个函数,它比较两个数的大小。 如果第一个数小了,就输...

2787
来自专栏web编程技术分享

浅谈js回调函数

3157
来自专栏C语言及其他语言

[每日一题]自定义函数与宏定义

前面,我们既一起研究了自定义函数的题,有看了宏定义的题,下面这题刚好就是要用自定义函数和宏定义解题的,帮大家巩固知识点 题目描述 分别用函数和带参的宏,从三个...

2945
来自专栏程序员互动联盟

【面试宝典】Java如何打印数组

面试官: 如何打印一个数组? 小白:用for循环。 面试官:如何打印一个List? 小白:用for循环。 面试官:如果打印一个二维数组? 小白:还是for循环。...

3689
来自专栏斑斓

作为Scala语法糖的设计模式

Scala算是一门博采众家之长的语言,兼具OO与FP的特性,若使用恰当,可以更好地将OO与FP的各自优势发挥到极致;然而问题也随之而来,倘若过分地夸大OO特性,...

3365
来自专栏一个会写诗的程序员的博客

React极简教程: Hello,World!React简史React安装Hello,World

A programming paradigm is a fundamental style of computer programming. There are...

811
来自专栏编程微刊

JavaScript经典面试题之简单算法

在 Virtual DOM 的基础上给 VNode 类添加 render 方法,render 方法把一个虚拟的 DOM 节点渲染成真正的 DOM 节点,例如:

1411
来自专栏Golang语言社区

第五节:Go语言常量

干货来了!!!为了让更多的小伙伴喜欢Golang、加入Golang之中来,Golang语言社区发起人彬哥联合业界大牛共同推出了Go语言基础、进阶、提高课程,目前...

1012
来自专栏代码世界

Python之面向对象一

引子 小游戏:人狗大战 角色:人和狗 角色属性:姓名,血量,战斗力和性别(种类) 技能:打/咬 用函数实现人打狗和狗咬人的情形 def Dog(name,blo...

3979
来自专栏MyBlog

Effective.Java 读书笔记(10)关于toString

针对于java.lang.Object已经帮我们实现好了的toString方法,当我们自己定义出来的类使用这古老的toString方法的时候,通常不会返回给你一...

1294

扫码关注云+社区