JS 中强大的操作符
数值分割符 _
ES2021 引入了数值分割符 _
,在数值组之间提供分隔,使一个长数值读起来更容易。
1 | let number = 100_0000_0000_0000 // 0太多了不用数值分割符眼睛看花了 |
此外,十进制的小数部分也可以使用数值分割符,二进制、十六进制里也可以使用数值分割符。
1 | 0x11_1 === 0x111 // true 十六进制 |
逗号运算符 ,
逗号操作符对它的每个操作数求值(从左到右),并返回最后一个操作数的值。
1 | expr1, expr2, expr3... |
示例:将数组的第一项和第二项调换,并返回两项之和:
1 | function reverse(arr) { |
零合并操作符 ??
零合并操作符 ??
是一个逻辑操作符,当左侧的操作数为 null
或者 undefined
时,返回右侧操作数,否则返回左侧操作数。空值合并操作符一般用来为常量提供默认值,保证常量不为 null
或者 undefined
1 | ndefined || 'default' // 'default' |
另外在赋值的时候,可以运用赋值运算符的简写 ??=
1 | let a = {b: null, c: 10} |
可选链操作符 ?.
可选链操作符 ?.
允许读取位于连接对象链深处的属性的值,而不必验证链中的每个引用是否有效。?.
操作符的功能类似于 .
链式操作符,不同之处在于,在引用为 null
或者 undefined
的情况下不会引起错误,该表达式短路返回值是 undefined
。
1 | const obj = { |
私有方法/属性
在一个类里面可以给属性前面增加 #
私有标记的方式来标记为私有,除了属性可以被标记为私有外,getter/setter
也可以标记为私有,方法也可以标为私有。
1 | class Person { |
双位运算符 ~~
可以使用双位操作符来替代正数的 Math.floor( )
,替代负数的 Math.ceil( )
。双否定位操作符的优势在于它执行相同的操作运行速度更快。Math.floor(v)
取小于等于v的值,向下取整,则Math.ceil
相反
1 | ~~4.5 // 4 |
void运算符
void运算符 对给定的表达式进行求值,然后返回
undefined
可以用来给在使用立即调用的函数表达式(IIFE)时,可以利用 void
运算符让 JS 引擎把一个 function
关键字识别成函数表达式而不是函数声明。
1 | function iife() { console.log('foo') }() // 报错,因为JS引擎把IIFE识别为了函数声明 |
还可以用在箭头函数中避免传值泄漏,箭头函数,允许在函数体不使用括号来直接返回值。这个特性给用户带来了很多便利,但有时候也带来了不必要的麻烦,如果右侧调用了一个原本没有返回值的函数,其返回值改变后,会导致非预期的副作用。
1 | const func = () => void customMethod() // 特别是给一个事件或者回调函数传一个函数时 |
安全起见,当不希望函数返回值是除了空值以外其他值,应该使用 void
来确保返回 undefined
,这样,当 customMethod 返回值发生改变时,也不会影响箭头函数的行为。
其他常用操作符
三元表达式:很简单了,大家经常用,
expr ? expr1 : expr2
如果expr
为真值则返回expr1
,否则返回expr2
赋值运算符简写:加法赋值
+=
、减法赋值-=
、乘法赋值*=
、除法赋值/=
、求幂赋值**=
、按位或复制|=
、按位与赋值&=
、有符号按位右移赋值>>=
、无符号按位右移赋值>>>=
、逻辑空赋值??=
….求幂运算符:
var1 ** var2
相当于Math.pow
,结果为var1
的var2
次方