深入解析 JavaScript 布尔操作符和比较操作符

一、布尔操作符

在开发时,布尔操作符是很有用的,可以精简很多代码,干掉很多多余的 id-else 语句,下面来看看常见的三种布尔操作符。

1. 逻辑非操作符(!)

逻辑非操作符可以用于 JavaScript 中的任何值,这个操作符使用返回布尔值。逻辑非操作符首先会将操作数转化为布尔值,然后在对其取反。

逻辑非操作规则如下:

  • 如果操作数是对象,则返回 false;

  • 如果操作数是空字符串,则返回 true;

  • 如果操作数是非空字符串,则返回 false;

  • 如果操作数是数值 0,则返回 true;

  • 如果操作数是非 0 数值(包括 Infinity),则返回 false;

  • 如果操作数是 null,则返回 true;

  • 如果操作数是 NaN,则返回 true;

  • 如果操作数是 undefined, 则返回 true.

逻辑非操作符也可以用于将任何值转化为布尔值,同时使用两个!,相当于调用了 Boolean()方法:

!!"blue" // true
!!0;     // false
!!NaN    // false
!!""     // false
!!12345  // true

2. 逻辑与操作符(&&)

逻辑与操作符的两个操作数都为真时,最终结果才会返回真。该运算符可以用于任何类型的数据。如果有操作数不是布尔值,则结果并一定会返回布尔值,会遵循以下规则:

  • 如果第一个操作数是对象,则返回第二个操作数;

  • 如果第二个操作数是对象,则只有在第一个操作数的求值结果为 true 的情况下才会返回该对象;

  • 如果两个操作数都是对象,则返回第二个操作数;

  • 如果第一个操作数是 null,则返回 null;

  • 如果第一个操作数是 NaN,则返回 NaN;

  • 如果第一个操作数是 undefined,则返回 undefined;

根据第二条规则,我们可以对我们项目代码中的代码进行优化:

if(data) {
  setData(data);
}

// 改写后:
data && setData(data);

这里当 data 为真时,也就是存在时,才会执行 setData 方法,代码就精简了很多。

逻辑与操作符是一种短路操作符,只要第一个操作数为 false,就不会继续执行运算符后面的表达式,直接返回 false。上面的 data 如果是不存在的,就会直接发生短路,不会继续执行后面的方法。

3. 逻辑或操作符(||)

逻辑或操作符和逻辑与操作符类似,不过只要两个操作数中的一个为真,最终的结果就为真。该运算符可以用于任何类型的数据。如果有操作数不是布尔值,则结果并一定会返回布尔值,会遵循以下规则:

  • 如果第一个操作数是对象,则返回第一个操作对象;

  • 如果第一个操作数的求值结果是 false,则返回第二个操作数;

  • 如果两个操作数都是对象,则返回第一个操作数;

  • 如果两个操作数都是 null,则返回 null;

  • 如果两个数都是 NaN,则返回 NaN;

  • 如果两个数都是 undefined,则返回 undefined。

逻辑或操作符也是具有短路特性,如果第一个操作数为真,那么第二个操作数就不需要在进行判断了,会直接返回 true。

可以利用这个特性给变量设置默认值:

let datas = data || {};

这里,如果 data 不存在,就会将 datas 赋值为第二个操作数(默认值)。

二、比较操作符

1. 相等操作符

相等操作符包括四种:

  • 等于(==)

  • 不等于(!=)

  • 全等(===)

  • 不全等(!==)

JavaScript 中的等于用两个等号(==)表示,如果两个操作数相等,那么就返回 true。不等于和等于相反。在进行比较时,两个操作数都会进行强制类型转换,在确实是否相等。其判断规则如下:

  1. 首先会判断两者类型是否相同, 相同的话就比较两者的大小;

  2. 类型不相同的话,就会进行类型转换;

  3. 会先判断是否在对比  null  和  undefined,是的话就会返回  true

  4. 判断两者类型是否为  string  和  number,是的话就会将字符串转换为  number

1 == '1'
      ↓
1 ==  1
  1. 判断其中一方是否为  boolean,是的话就会把  boolean  转为  number  再进行判断

'1' == true
        ↓
'1' ==  1
        ↓
 1  ==  1
  1. 判断其中一方是否为  object  且另一方为  stringnumber  或者  symbol,是的话就会把  object  转为原始类型再进行判断

'1' == { name: 'js' }        
 ↓
'1' == '[object Object]'

其流程图如下:

fileOf7174.png

需要注意,如果其中一个操作数是 NaN,相等运算符会返回 false,不相等运算符会返回 true。

对于不等于运算符(!=),只有在强制类型转化后不相等才会返回 true。

对于全等运算符(===),只有当两个操作数的数据类型和值都相等时,才会返回 true。它并不会进行数据类型的转化。

对于不全等运算符(!==),只有两个操作数在不进行类型转化的情况下是不相等的,才会返回 true。

在平时的开发中,建议使用全等和不全等在做比较,这样会更加严谨,避免出现意料之外的结果。

2. 关系操作符

关系操作符包括四种:

  • 小于(<)

  • 大于(>)

  • 小于等于(<=)

  • 大于等于(>=)

这几个操作符都会返回一个布尔值,他们操作时会遵循以下规则:

  • 如果这两个操作数都是数值,则执行数值比较;

  • 如果两个操作数都是字符串,则比较两个字符串对应的字符编码值;

  • 如果一个操作数是数值,则将另一个操作数转换为一个数值,然后执行数值比较;

  • 如果一个操作数是对象,则调用这个对象的 valueOf()方法,并用得到的结果根据前面的规则执行比较;

  • 如果一个操作数是布尔值,则先将其转换为数值,然后再执行比较。

猜你喜欢

转载自blog.csdn.net/qq_24956515/article/details/143226694