不是很常见的运算符或表达式(个人版)

90 阅读4分钟

起因

今天在看网上的代码时,发现了一段自己不是很理解的代码

function groupArrayByKey(arr = [], key) {
    return arr.reduce((t, v) => (!t[v[key]] && (t[v[key]] = []), t[v[key]].push(v), t), {})
}

其中主要不理解的是 (!t[v[key]] && (t[v[key]] = []), t[v[key]].push(v), t) 这一段,后面经过查询,了解了这是逗号运算符,逗号运算符对它的每个操作数从左到右求值,并返回最后一个操作数的值。因此我决定汇总一下我在开发中不太常用但是很方便的运算符,以便以后我自己来查阅。

运算符

&

按位与运算符


&=

按位与赋值,与 += 类似


~

按位非运算符


|

按位或运算符


|=

按位或赋值,与 += 类似


^

按位异或运算符


^=

按位异或赋值,与 += 类似


,

逗号运算符,对它的每个操作数从左到右求值,并返回最后一个操作数的值。


<<

左移操作符 (<<)  将第一个操作数向左移动指定位数,左边超出的位数将会被清除,右边将会补零。


<<=

左移赋值运算符(<<=)将变量向左移动指定的位数,并将结果赋值给变量。


&&

逻辑与运算符, 一般来说,当从左到右求值时,该操作符返回第一个假值操作数的值;如果它们都是真值,则返回最后一个操作数的值。


||

逻辑或运算符

逻辑或从左到右进行求值,它使用如下规则进行“短路”测试:

(some truthy expression) || expr 被短路评估为真值。

短路意味着上面的 expr 部分不被求值,因此不会发生任何副作用(例如,如果 expr 是一个函数调用,调用就不会发生)。这是因为在对第一个操作数进行评估后,操作数的值已经确定。


??=

逻辑空赋值,逻辑空赋值运算符(x ??= y)仅在 x 是空值null 或 undefined)时对其赋值。


??

逻辑空运算符,空值合并运算符?? )是一个逻辑运算符,当左侧的操作数为 null 或者 undefined 时,返回其右侧操作数,否则返回左侧操作数。

逻辑或运算符(||不同,逻辑或运算符会在左侧操作数为假值时返回右侧操作数。也就是说,如果使用 || 来为某些变量设置默认值,可能会遇到意料之外的行为。比如为假值(例如,'' 或 0)时。见下面的例子。

const foo = null ?? 'default string';
console.log(foo);
// Expected output: "default string"

const baz = 0 ?? 42;
console.log(baz);
// Expected output: 0

?.

可选链运算符?. )允许读取位于连接对象链深处的属性的值,而不必明确验证链中的每个引用是否有效。?. 运算符的功能类似于 . 链式运算符,不同之处在于,在引用为空 (nullish ) (null 或者 undefined) 的情况下不会引起错误,该表达式短路返回值是 undefined。与函数调用一起使用时,如果给定的函数不存在,则返回 undefined


>>

右移运算符>> )将一个操作数的二进制表示形式向右移动指定位数,该操作数可以是数值或者 BigInt 类型。右边移出位被丢弃,左边移出的空位补符号位(最左边那位)。该操作也称为“符号位传播右移”(sign-propagating right shift)或“算术右移”(arithmetic right shift),因为返回值的符号位与第一个操作数的符号位相同。


>>=

右移赋值运算符(>>=)将变量向右移动指定的位数,并将结果赋值给变量。


>>>

无符号右移运算符(>>> (零填充右移)将左操作数计算为无符号数,并将该数字的二进制表示形式移位为右操作数指定的位数,取模 32。向右移动的多余位将被丢弃,零位从左移入。其符号位变为 0,因此结果始终为非负数。与其他按位运算符不同,零填充右移返回一个无符号 32 位整数。


>>>=

无符号右移赋值>>>=)运算符向右移动移动指定(二进制)位数,并将结果赋值给变量。