内容提要
- 算术远算符
- 比较运算符
- 布尔运算符
- 二进制位运算符
- 其他运算符
算术远算符
数学运算
number运算
- Addition
+
、Subtraction-
、Multiplication*
、Division/
- Remainder 余数
x%7
,取余、取模 - 指数
x**3
- Increment自增、Decrement自减
x++
、++x
、x--
、--x
- Convert to number 求值运算符
+x
- Negate 负数运算符
-x
强制类型转换,不报错
|
|
string运算
- 连接运算
123
+abc
尽量少用自增自减,容易记错
不同类型不要加起来
比较运算符
>
<
>=
<=
==
不记!=
不记===
!==
永远不要使用
==
,用===
代替
==
的问题在于,它总是自作聪明(非预期自动类型转换)
|
|
但是右边三个互不相等
x == y
真值表
对于
==
的判断,JS
是怎么处理的不需要记,只是为了说明==
有多少不靠谱
|
|
速记
x | y | 结果(隐式转换) |
---|---|---|
null | undefined | true |
Number | String | x == toNumber(y) |
Boolean | (any other type) | toNumber(x) == y |
Object | String or Number | toPrimitive(x) == y |
any others | any others | false |
toNumber()
type | Result |
---|---|
Undefined | NaN |
Null | 0 |
Boolean | true -> 1, false -> 0 |
String | “abc” -> NaN, “123” -> 123 |
toPrimitive()
- 对于 Object 类型,先尝试调用 .valueOf 方法获取结果。
- 如果没定义,再尝试调用 .toString方法获取结果
令人难以理解
x === y
真值表
没有任何费解
- 基本类型看值是否相等
- 对象看地址是否相等
|
|
唯一特例
|
|
布尔运算符
或且非
||
假短路 或&&
真短路 且!
取反A?B:C
三目
短路逻辑
console && console.log && console.log('hi')
,防止console
不存在报错a = a || 100
,a
的保底值
二进制位运算符
或、与、否
|
,左右两个都为0
,则结果为0
,否则为1
&
~
异或
^
- 左右两个位相同,则结果为
0
,否则为1
左移、右移
<<
和>>
头部补零的右移运算符
>>>
工作很少用,面试问
使用
与运算符
判断奇偶
代码
偶数 & 1 = 0
奇数 & 1 = 1
使用
~~
、>>
、<<
、>>>
、|
来取整
代码
|
|
使用
^=
来交换a
、b
的值
代码
|
|
位运算用的甚少,容易忘
面试前重新看看即可
其他运算符
记录JS各种奇葩bug的JavaScript 秘密花园
点运算符
点运算语法
对象.属性名 = 属性值
点运算作用
- 读取对象的属性值
|
|
|
|
点运算疑问
- 不是对象,为什么也可以有属性:
'a-b-c.split('-')
- JS有特殊逻辑,点前面不是对象,就把它封装成对象
number
会变成Number
对象string
会变成String
对象bool
会变成Boolean
对象- 程序员从来不用这三种对象,抽佣简单类型
void
运算符
void
运算语法
void
表达式或语句
void
运算作用
- 求表达式的值,或执行语句
- 然后
void
的值总是为undefined
void
需求
|
|
return
假值可以阻止默认动作- 改用
void
可以炫技,但没啥卵用
逗号,
运算符
,
运算语法
表达式1,表达式2,...,表达式n
,
运算作用
将表达式n的值作为整体的值
,
使用
|
|
typeof
运算符优先级
先算什么,后算什么
不同运算符:优先级
1 + 2 * 3
!a === 1
是(!a) === 1
new Person().sayHi()
相同运算符:结合性
- 从左到右
a + b + c
- 从右到左
a = b = c = d
,赋值
优先级列表
20个运算符
- 圆括号优先级最高
- 其他一律不记
面试技巧
不推荐学的
==
不学- 优先级不学
面试遇到怎么办
- 向面试官说明为什么不学,以及态度
- 非正常范例,工作避免写,分不清的用
()
- 如果非要答,直接跳过
答
类型转换
隐性(强制)类型转换
不要在工作中出现下面类似的误导性的写法
if的判断
|
|
js 是如何处理的?
|
|
- 对于括号里的表达式,会被强制转换为布尔类型
类型 | 结果 |
---|---|
Undefined | false |
Null | false |
Boolean | 直接判断 |
Number | +0, −0, 或者 NaN 为 false,其他为 true |
String | 空字符串为 false,其他都为 true |
Object | true |