JavaScript语法:新加入的**运算符,哪里有些不一样呢?

更新表达式 UpdateExpression

左值表达式搭配 ++ -- 运算符,可以形成更新表达式。

-- a;
++ a;
a --
a ++

一元运算表达式 UnaryExpression

delete a.b;
void a;
typeof a;
- a;
~ a;
! a;
await a;

更新表达式搭配了一个一元表达式

乘方表达式 ExponentiationExpression

乘方表达式也是由更新表达式构成的。它使用**号。

++i ** 30
2 ** 30 //正确
-2 ** 30 //报错 -(2 ** 30)

-2这样的一元运算表达式,是不可以放入乘方表达式的,如果需要表达类似的逻辑,必须加括号。

4 ** 3 ** 2 // 实际运算是 4 ** (3 ** 2) 结果是 262144

乘法表达式 MultiplicativeExpression

乘方表达式可以构成乘法表达式,用乘号或者除号、取余符号连接就可以了

*
/
%

加法表达式 AdditiveExpression

加法表达式是由乘法表达式用加号或者减号连接构成的。

+
-

移位表达式 ShiftExpression

移位表达式由加法表达式构成,移位是一种位运算,分成三种:

<< 向左移位
>> 向右移位
>>> 无符号向右移位

移位运算把操作数看作二进制的整数,然后移动特定位数,所以左移n位相当于乘于2的n次方,右移相当于除以2取整n次。
普通移位会保持正负数,无符号移位会把减号视为符号为1,同时参与移位:

-1 >>> 1 // 2147483647 也就是2的31次方

在JavaScript中,二机制操作整数并不能提高性能。移位在这里仅仅作为一种数学运算存在。

关系表达式 RelationalExpression

关系表达式就是大于、小于、大于等于、小于等于等运算符号连接,统称为关系运算。
<=,>=完全是针对数字的

<=
>=
<
>
instanceof
in

相等表达式 EqualityExpression

在语法上,相等表达式是由关系表达式用相等比较运算符(如 ==)连接构成的。
相等表达式由四种运算符和关系表达式构成:

==
!=
===
!==

对于不同的变量比较时,==运算只有三条规则:

  • undefined与null相等
  • 字符串和boolean都转换为数字再比较
  • 对象都转换为primitive类型再比较

位运算表达式

位运算表达式含有三种:

  • 按位与表达式 BitwiseANDExpression
  • 按位异或表达式 BitwiseANDExpression
  • 按位或表达式 BitwiseORExpression。

按位与表达式由按位与运算符(&)连接按位异或表达式构成,按位与表达式把操作数视为二进制整数,然后把两个操作数按位做与运算。
按位异或表达式由按位异或运算符(^)连接按位与表达式构成,按位异或表达式把操作数视为二进制整数,然后把两个操作数按位做异或运算。异或两位相同时得0,两位不同时得1。
异或运算有个特征,那就是两次异或运算相当于取消。所以有一个异或运算的小技巧,就是用异或运算来交换两个整数的值。

let a = 102, b = 324;
a = a ^ b;
b = a ^ b;
a = a ^ b;
console.log(a, b);

逻辑与表达式和逻辑或表达式

逻辑与表达式由按位或表达式经过逻辑与运算符连接构成,逻辑或表达式则由逻辑与表达式经逻辑或运算符连接构成。

||
&&

逻辑表达式具有短路的特性

true || foo();
// foo不会被执行

条件表达式 ConditionalExpression

条件表达式由逻辑或表达式和条件运算符构成,条件运算符又称三目运算符,它有三个部分,由两个运算符?和:配合使用。

condition ? branch1 : branch2

需要注意的是,条件表达式也和逻辑表达式一样,可能忽略后面表达式的计算。这点与C语言的条件表达式是不一样的。

此文章为7月Day15学习笔记,内容来源于极客时间《重学前端》,日拱一卒,每天进步一点点💪💪

豪猪
4 声望4 粉丝

undefined