一、操作符
本小结介绍了如下的一些操作符:
| 操作符类型 | 内容 | ||
|---|---|---|---|
| 一元 | + - ++ -- | ||
| 位 | ~ & | ^ << >> | |
| 布尔 | ! && | ||
| 乘性 | * / % | ||
| 指数 | ** | ||
| 加性 | + - | ||
| 关系 | < <= > >= | ||
| 相等 | == === != !== | ||
| 条件 | ? : | ||
| 赋值 | = += -= *= /= %= <<= >>= >>>= | ||
| 逗号 | , |
大多数操作符的作用都非常熟悉了,下面只针对一些需要注意的地方简单介绍:
-
++和--放在变量前后的区别:前缀变量值先变,后缀语句值先变。
-
一元加减:先Number()转型,再取正/负值
-
按位非~相当于返回反码对应的值,即 ~n = -n - 1 = 补码 - 1
-
!! n = Boolean(n)
-
&& 和 || 返回的不一定是布尔值。它们采取效率最高的方式判断返回值,比如 a && b,当 !!a 是true时会直接返回b,否则返回a。a || b,!! a是false时也会直接返回b,否则返回a。说白了,表达式返回值要么是a,要么是b。
-
加性操作符都涉及隐式类型转换,但要注意加号有可能是字符串连接。
-
乘性操作符也会先用Number()转型,如果用n代表不是0、NaN、±Infinity的任意数值(假设是正数),那么:
Infinity * 0 = NaN
Infinity * n = Infinity
Infinity * Infinity = Infinity
Infinity / Infinity = NaN
Infinity / n = Infinity
Infinity / 0 = Infinity
n / 0 = Infinity
0 / 0= NaN
-
两个字符串判断大小时是按编码来逐个判断的。
-
判断相等时,null 和 undefined不转为数值去比较。
-
赋值时逗号操作符会返回最后一个值。
各操作符的优先级:
剩余操作符优先级非常低,因此 ...n+m 相当于 ...(n+m)。
| 操作符 | 描述 |
|---|---|
| () | 圆括号 |
| n.name n['name'] | 访问属性 |
| n++ n-- | 后缀递增/减 |
| ! ~ +n -n ++n --n | 非 一元 前缀递增/减 |
| ** | 指数 |
| * / % | 乘性 |
| + - | 加性 |
| < <= > >= | 关系 |
| == === != !== | 等性 |
| & ^ | | 按位 |
| && | 与 |
| || | 或 |
| ? : | 三目 |
| = | 赋值 |
| ...n | 剩余操作符 |
| , | 逗号 |
二、语句
1、if-else
条件可以是任何表达式,会自动转型为布尔值
2、do-while循环
至少执行一次
3、while循环、for循环
尽量使用let声明迭代变量,限定作用域
4、for-in
用于枚举对象中的非符号键属性,最好使用const声明属性名。顺序不保证。
5、for-of
用于遍历可迭代对象的元素,常用于数组。
6、标签语句
常用于嵌套循环,不常用
7、break、continue
break用于结束整个循环,continue用于结束本次循环。
8、switch语句
条件可以是常量、变量、表达式。判断是否全等。