JavaScript之逻辑与、或、非运算


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

if(true && true) console.log('ok');
// 打印ok

if(true && false) console.log('ok');
// 什么都不做;

if(false && false) console.log('ok');
// 什么都不做;


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

if(true || true) console.log('ok');
// 打印ok

if(true || false) console.log('ok');
// 打印ok

if(false || false) console.log('ok');
// 什么都不做;


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

!true
// false

!false
// true

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

true || XXX
// 真true

下面另外一个例子:

true || 2222
// 真true

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

false || true

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


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

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

var person = {
  name: 'gcy',
  age: 22
}

console.log(person.job || 'undefined');
// 打印出'undefined'

这个例子中我们对员工.工作数据和一个默认字符串’未定义’数据进行运算,再用控制台命令console.log打印出运算结果。这里人.工作属性并不存在,所以它的值求出来是未定义。未定义这个值等同于假,因此JavaScript会继续去求或符号另一边的数据值,最后结果会和第二个值一致。
为了更清楚地说明这一点,我们看看如果人对象包含一个工作属性会怎么运算:

var person = {
  name: 'nml',
  age: 18,
  **job: 'It'**
}

console.log(person.job || 'undefined');
// 打印出It

这次,人.工作属性存在,所以和之前不同,式子会短路求值,人.工作的值教师会打印到控制台上去。
想复习一下JavaScript中哪些值等同于假吗?

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

var a;
var b = null;
var c = undefined;
var d = 5;
var e = 'six';

`var f = a || b || c || d || e;`

`console.log(f);`

看一下代码,想一下控制台会打印出来什么。想好了吗?看看下面的答案。
答案
有没有猜是4?不错。如果没猜对也没关系,我们分步骤来看看:

var a; **// a值未定义 (等同于假)**
var b = null; **// a值是null (等同于假)**
var c = undefined; **// a值是未定义 (等同于假)**
var d = 5; **// b的值是一个数字 (这里不等同于假)**
var e = 'six'; **// 上一步已经短路求值,所以到不了这一步**

`var f = a || b || c || d || e;`

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

memory丶of

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值