前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >学习JavaScript:逻辑与、或、非运算

学习JavaScript:逻辑与、或、非运算

作者头像
疯狂的技术宅
发布2019-03-27 15:18:07
5.9K0
发布2019-03-27 15:18:07
举报
文章被收录于专栏:京程一灯京程一灯

JavaScript有三种逻辑运算符,可以用于布尔型或非布尔型的数据类型。在本文中我们一起来探讨一下布尔型数据的逻辑运算。

  • ||
  • &&
  • !

运算符写作两个与符号: &&。布尔型数据进行运算时,所有的运算数据值都为真,整个式子结果才为真。如果其中一个或两个运算数据值为假,则的结果也是假:

代码语言:javascript
复制
if(true && true) console.log('yes');
// 打印yes
代码语言:javascript
复制
if(true && false) console.log('yes');
// 什么都不做...
代码语言:javascript
复制
if(false && false) console.log('yes');
// 什么都不做...

运算符写作两个通道符 ||。布尔数据进行运算时只要有一个值为真则整个运算式值也为真:

代码语言:javascript
复制
if(true || true) console.log('yes');
// 打印yes
代码语言:javascript
复制
if(true || false) console.log('yes');
// 打印yes
代码语言:javascript
复制
if(false || false) console.log('yes');
// 什么都不做...

Logical 逻辑运算符写作一个感叹号: !。 只能用于单个运算数据。运算数据值为真时结果为假,反之结果为真:

代码语言:javascript
复制
!true
// 假false
代码语言:javascript
复制
!false
// 真true

短路求值

关于JavaScript逻辑运算符有两点很重要。一是运算时求值顺序从左到右,二是运算时会短路。 逻辑运算时,第一个运算数据值为真,JavaScript就会让整个运算短路,第二个运算数据连看都不看。下面的例子里,星号部分**表示这里可以是任何值,完全不影响运算,JavaScript甚至都不会去看这个或运算符右边的数据

代码语言:javascript
复制
true || _****_
// 真true

再看另外一个例子:

代码语言:javascript
复制
true || 1234
// 真true

不管第二个数据值是不是参加运算,只要第一个值为真,第二个值JavaScript就不管了。 现在大家可能有问题要问了,如果第一个值为假呢?问得好。 看看下面的例子,大家觉得会有什么结果?

代码语言:javascript
复制
false || true

要记住,逻辑运算只需要其中一个数据值为真即为真。从左到右依次求值,第一个值为假,所以这次的式子不会短路。相反,JavaScript会继续求第二个数据的值。第二个值为真,所以最后结果也是真。

那么为什么说理解短路求值很重要呢?

因为短路功能可以给我们带来些方便。下面的例子中,我们有一个 对象数据。这个数据里有一个 名字和一个 年龄属性数据。然后我们要用控制台命令 console.log工作属性打印出来。问题是我们无法确定一个 对象是不是含有 工作属性,所以我们可以运用 运算和短路求值来更方便地解决这个问题:

代码语言:javascript
复制
var person = {
  name: 'Jack',
  age: 34
}
代码语言:javascript
复制
console.log(person.job || 'unemployed');
// 打印出'unemployed'

这个例子中我们对 人.工作数据和一个默认字符串 '无业'数据进行运算,再用控制台命令 console.log打印出运算结果。这里 人.工作属性并不存在,所以它的值求出来是 未定义未定义这个值等同于假,因此JavaScript会继续去求 符号另一边的数据值,最后结果会和第二个值一致。

为了更清楚地说明这一点,我们看看如果 对象包含一个 工作属性会怎么运算:

代码语言:javascript
复制
var person = {
  name: 'Jack',
  age: 34,
  **job: 'teacher'**
}
代码语言:javascript
复制
console.log(person.job || 'unemployed');
// 打印出teacher

这次, 人.工作属性存在,所以和之前不同,式子会短路求值, 人.工作的值 教师会打印到控制台上去。

想复习一下JavaScript中哪些值等同于假吗?看一下JavaScript中的对决


再来一个例子

很多人用过这个例子,这一段代码摘自stack overflow:

代码语言:javascript
复制
var a;
var b = null;
var c = undefined;
var d = 4;
var e = 'five';
代码语言:javascript
复制
`var f = a || b || c || d || e;`
代码语言:javascript
复制
`console.log(f);`

看一下代码,想一下控制台会打印出来什么。想好了吗?看看下面的答案。


答案

有没有猜是 4?不错。如果没猜对也没关系,我们分步骤来看看:

代码语言:javascript
复制
var a; **// a值未定义 (等同于假)**
var b = null; **// a值是null (等同于假)**
var c = undefined; **// a值是未定义 (等同于假)**
var d = 4; **// b的值是一个数字 (这里不等同于假)**
var e = 'five'; **// 上一步已经短路求值,所以到不了这一步**
代码语言:javascript
复制
`var f = a || b || c || d || e;`

a, b, c的值都为假。运算看到假就继续求值。到变量b这一处时得到了 4这个值,整个运算式短路,所以 4这个值赋给了变量 f


往期精选文章

使用虚拟dom和JavaScript构建完全响应式的UI框架

扩展 Vue 组件

使用Three.js制作酷炫无比的无穷隧道特效

一个治愈JavaScript疲劳的学习计划

全栈工程师技能大全

WEB前端性能优化常见方法

一小时内搭建一个全栈Web应用框架

干货:CSS 专业技巧

四步实现React页面过渡动画效果

让你分分钟理解 JavaScript 闭包



小手一抖,资料全有。长按二维码关注京程一灯,阅读更多技术文章和业界动态。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-10-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 京程一灯 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 短路求值
  • 再来一个例子
  • 答案
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档