原生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
相关知识说明
操作符优先级(由高到低)
逻辑非
前置递增和前置递减
算术操作符
关系操作符
逻辑与 逻辑或
条件操作符
赋值操作符
- 其实添加数据也可以这样简单——表单的第三步抽象(针对UI及后置代码)
- 为Symfony2和Redis正名,基于PHP的10亿请求/周网站打造
- 如何使用Python基线预测进行时间序列预测
- 如何使用统计显着性检验来解释机器学习结果
- 其实添加数据也可以这样简单——表单的第一步抽象(针对数据访问层)《怪怪设计论: 抽象无处不在 》有感
- WCF服务端运行时架构体系详解[上篇]
- 使命必达: 深入剖析WCF的可靠会话[编程篇](下)
- 在网页里让文本框只能输入数字的一种方法。外加回车换Tab
- 如何用Python从零开始实现简单的线性回归
- 使命必达: 深入剖析WCF的可靠会话[编程篇](上)
- 页面回发后,让页面自动滚动到指定位置的一种简单的方法
- [自定义服务器控件] 第二步:下拉列表框。
- WCF服务端运行时架构体系详解[中篇]
- [自定义服务器控件] 第三步:CheckBoxList。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- R语言ggmap空间可视化机动车交通事故地图
- 基于matlab的Lorenz系统仿真可视化
- 使用R语言对进行空间数据可视化
- R语言中基于混合数据抽样(MIDAS)回归的HAR-RV模型预测GDP增长
- R语言马尔可夫体制转换模型Markov regime switching
- Python中的ARIMA模型、SARIMA模型和SARIMAX模型对时间序列预测
- python3用ARIMA模型进行时间序列预测
- R语言马尔可夫转换模型研究交通伤亡人数事故预测
- scrapy爬虫框架和selenium的使用:对优惠券推荐网站数据LDA文本挖掘
- 使用R语言进行Metroplis-in-Gibbs采样和MCMC运行分析
- R语言中的马尔科夫机制转换(Markov regime switching)模型
- R语言ARMA-EGARCH模型、集成预测算法对SPX实际波动率进行预测
- nginx快速入门
- R语言中进行期权定价的Heston模型
- 使用R语言随机波动模型SV处理时间序列中的随机波动率