JS运算符
Contents
1 逻辑运算符
1.1 基本用法
||
(或)
|
|
a 或者 b 有一个为真,返回true
。
&&
(与)
|
|
a 和 b 都为真,才会返回true
。
!
(非)
对 a 的值取反。
!!
(强制类型转换)
转换类型为boolean
,这样做的目的就是保证值只能在true/false中取。
|
|
1.2 短路用法
在&&
的运算中,代码从左往右执行,找假值,如果是真就继续执行下一个,找不到就执行最后一个
|
|
在||
的运算中,代码从左往右执行,找真值,如果是假就继续执行下一个,找不到就执行最后一个
|
|
我们可以利用短路运算符的特性对逻辑判断(switch\if..else)进行简写:
|
|
1.3 赋值用法
- 或等于(
||=
)
|
|
- 且等于(
&&=
)
|
|
2 零合并操作符
- 零合并操作符
??
是一个逻辑操作符,只会在左侧的操作数为null
或者undefined
时,返回右侧操作数,否则返回左侧操作数。
|
|
-
空值合并操作符一般用来为常量提供默认值,保证常量不为
null
或者undefined
,以前一般使用||
来做这件事variable = variable || 'bar'
。 -
然而,由于
||
是一个布尔逻辑运算符,左侧的操作数会被强制转换成布尔值用于求值。任何假值(0
,''
,NaN
,null
,undefined
)都不会被返回。这导致如果你使用0
、''
、NaN
、false作为有效值,就会出现不可预料的后果。 -
??
可以理解为是||
的升级版。
可以在浏览器中执行下面的代码感受一下:
|
|
另外在赋值的时候,可以运用逻辑空分配符 ??=
|
|
3 可选链操作符
-
可选链操作符
?.
允许读取位于连接对象链深处的属性的值,而不必验证链中的每个引用是否有效。 -
?.
操作符的功能类似于.
链式操作符,不同之处在于,在引用为null
或者undefined
的情况下不会引起错误,该表达式短路返回值是undefined
。 -
当尝试访问可能不存在的对象属性时,可选链操作符将会使表达式更短、更简明。
|
|
-
以前可能会通过
obj && obj.a && obj.a.b
来获取一个深度嵌套的子属性,现在可以直接简写为obj?.a?.b
即可。 -
可选链除了可以用在获取对象的属性,还可以用在数组的索引
arr?.[index]
,也可以用在函数的判断func?.(args)
,当尝试调用一个可能不存在的方法时也可以使用可选链,在函数不存在时返回undefined
而不是直接抛异常。
|
|
4 按位取反操作符
- 按位非操作符由一个波浪线
~
表示,执行按位非的结果就是返回数值的反码
|
|
- 立即执行函数:本质上就是将函数声明变成一个表达式,因此可以解析完直接调用。
- 函数前加上
~
,其作用是把函数声明转换为表达式,这样就可以直接运行。
|
|
这种简写只能用于无返回值的函数,否则会对函数的返回值进行运算,这样可能会导致最终的结果与期望值不一致。
|
|
-
将
-1
转换为假值(应用于字符串的indexOf方法)1 2 3 4 5
var str='haha' if(~str.indexOf('b')){ // 这样更加简洁 ... } // 数组的indexOf可能会返回0,因此不建议使用~符号
-
将Boolean转成1和0
1 2 3
~~true===1 ~~false===0 // 其实还有更精简的写法 +false 和 +true
-
去小数
1 2
~~ 1.5 === 1 ~~ -1.5 === -1 // 注意这里和floor()就不同了如果用floor 得到的是-2
Author gsemir
LastMod 2021-12-02