内容提要
- 算术远算符
- 比较运算符
- 布尔运算符
- 二进制位运算符
- 其他运算符
算术远算符
数学运算
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) === 1new 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 |