一、布尔操作符
在开发时,布尔操作符是很有用的,可以精简很多代码,干掉很多多余的 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。不等于和等于相反。在进行比较时,两个操作数都会进行强制类型转换,在确实是否相等。其判断规则如下:
-
首先会判断两者类型是否相同, 相同的话就比较两者的大小;
-
类型不相同的话,就会进行类型转换;
-
会先判断是否在对比
null
和undefined
,是的话就会返回true
-
判断两者类型是否为
string
和number
,是的话就会将字符串转换为number
1 == '1'
↓
1 == 1
-
判断其中一方是否为
boolean
,是的话就会把boolean
转为number
再进行判断
'1' == true
↓
'1' == 1
↓
1 == 1
-
判断其中一方是否为
object
且另一方为string
、number
或者symbol
,是的话就会把object
转为原始类型再进行判断
'1' == { name: 'js' }
↓
'1' == '[object Object]'
其流程图如下:
需要注意,如果其中一个操作数是 NaN,相等运算符会返回 false,不相等运算符会返回 true。
对于不等于运算符(!=),只有在强制类型转化后不相等才会返回 true。
对于全等运算符(===),只有当两个操作数的数据类型和值都相等时,才会返回 true。它并不会进行数据类型的转化。
对于不全等运算符(!==),只有两个操作数在不进行类型转化的情况下是不相等的,才会返回 true。
在平时的开发中,建议使用全等和不全等在做比较,这样会更加严谨,避免出现意料之外的结果。
2. 关系操作符
关系操作符包括四种:
-
小于(<)
-
大于(>)
-
小于等于(<=)
-
大于等于(>=)
这几个操作符都会返回一个布尔值,他们操作时会遵循以下规则:
-
如果这两个操作数都是数值,则执行数值比较;
-
如果两个操作数都是字符串,则比较两个字符串对应的字符编码值;
-
如果一个操作数是数值,则将另一个操作数转换为一个数值,然后执行数值比较;
-
如果一个操作数是对象,则调用这个对象的 valueOf()方法,并用得到的结果根据前面的规则执行比较;
-
如果一个操作数是布尔值,则先将其转换为数值,然后再执行比较。