算术运算符
- 加减乘除
1 + 1 // 2 1 + true // 2 'a' + 'bc' // "abc" '3' + 4 + 5 // "345" 3 + 4 + '5' // "75" 1-1 // 0 2*2 // 4 2/0 // Infinity
- 余数 %
10%7 //3 -1%7 //-1
- 指数 **
6**2 // 36 7**3 // 343
- 自增自减 x++ / ++x / x-- / --x
let a=1 a++ 1 a // 2 let b=2 ++b 3 b // 3 let c=5 c-- 5 c // 5 let d = 10 --d 9 d // 9
- 数值运算符 +x
+true // 1 +[] // 0 +{} // NaN
- 负数运算符 -x
var x = 1; -x // -1 -(-x) // 1
- 加法运算符存在重载,字符串的位置不同会导致不同的结果
- 减法、除法和乘法,都是将字符串自动转为数值,然后再运算
- 如果运算子是对象,必须先转成原始类型的值,然后再相加
- 余数运算符运算结果的正负号由第一个运算子的正负号决定
- 尽量少用自增自减
- x++ 和 ++x x在前,值为前;x在后,值为后
- 不同类型不要相加
- 数值运算符的作用在于可以将任何值转为数值
- 负数运算符也具有将一个值转为数值的功能,只不过得到的值正负相反。连用两个负数值运算符,等同于数值运算符,连用两个负号需要用圆括号,不然会变成自减运算符
- 数值运算符号和负数运算符,都会返回一个新的值,而不会改变原始变量的值
- 字符串只支持 + 运算
- 如果数字 + 字符串,会将数字先变为字符串
- 如果数字 - 字符串,由于字符串不支持 - 号,所以会将字符串变为数字
比较运算符
- >
'cat' > 'dog' // false 5 > '4' // true true > false // true
- <
- >=
- <=
- ==
- !=
- ===
1 === "1" // false true === "true" // false +0 === -0 // true undefined === undefined // true null === null // true NaN === NaN // false
- !==
1 !== '1' // true // 等同于 !(1 === '1')
比较运算符用于比较两个值的大小,然后返回一个布尔值,表示是否满足指定的条件
对于非相等的比较,算法是先看两个运算子是否都是字符串,如果是的,就按照字典顺序比较(实际上是比较 Unicode 码点);否则,将两个运算子都转成数值,再比较数值的大小
JS 三位一体
- 0 == []
- 0 == '0'
- 0 == '\t'
- 右边三个互不相等
- == 会自动转换类型,尽量使用 ===
x == y 真值表
- [] == false 但不是 falsy
- [] == false 但 {} 却不是
- [[]] == false
x === y 真值表
- 基本类型看值是否相等
- 对象看地址是否相等
- [] !== []
- {} !== {}
唯一特例 NaN !== NaN
布尔运算符
或且非
- ||
- &&
- !
短路逻辑
- 防御性编程 console && console.log && console.log('hi')
- 以防 console 不存在报错
- a = a || 100
- a 的保底值
二进制运算符
或、与、否
- | 两个位都为0,则结果为0,否则为1
- & 两个位都为1,则结果为1,否则为0
- ~ 1变0,0变1,会以补码的形式变为负数
(0b1111 | 0b1010).toString(2) // "1111" (0b1111 & 0b1010).toString(2) // "1010" (~0b1111).toString(2) // "-10000"
异或
- ^ 两个位相同,则结果为0,否则为1
(0b1111 ^ 0b1010).toString(2) // "101"
左移右移
- << 和 >>
(0b0010 >> 1).toString(2) // "1" (0b0010 << 1).toString(2) // "100" (0b0011 >> 1).toString(2) // "1" (0b0011 << 1).toString(2) // "110"
头部补零的右移运算符
- >>>
使用与运算符判断奇偶
- 偶数 & 1 = 0
- 奇数 & 1 = 1
- 让一个数字与0b001做与运算,可以知道它的最后一位是1还是0
7 & 0b001 // 1 8 & 0b001 // 0
使用~, >>, <<, >>>, |来取整
- console.log(~~ 6.83) // 6
- console.log(6.83 >> 0) // 6
- console.log(6.83 << 0) // 6
- console.log(6.83 | 0) // 6
- console.log(6.83 >>> 0) // 6
使用^来交换 a b 的值
var a = 5 var b = 8 a ^= b b ^= a a ^= b console.log(a) // 8 console.log(b) // 5
let a =1 let b =2 [a,b]=[b,a] a // 2 b // 1
点运算符
语法
- 对象.属性名 = 属性值
作用
- 读取对象的属性值
不是对象,为什么也可以有属性?
- 'a-b-c'.split('-')
- JS 有特殊逻辑,点前面不是对象,就把它封装成对象
- number 会变成 Number 对象
- string 会变成 String 对象
- bool 会变成 Boolean 对象
- 一般不用这三种对象,只用简单类型
void 运算符
语法
- void 表达式或语句
作用
- 求表达式的值,或执行语句
- 然后 void 的值总是为 undefined
需求
- <a href="http://example.com" οnclick="f(); return false;">点击</a>
- return 假值可以阻止默认动作
- <a href="javascript: void(f())">文字</a>
- 改用 void 可以炫技
逗号运算符
语法
- 表达式1, 表达式2, ..., 表达式n
作用
- 将表达式 n 的值作为整体的值
使用
- let a = (1,2,3,4,5)
- 那么 a 的值就是 5
- let f = (x) => (console.log('平方值为'), x*x)
- 注意上面的括号不能省
运算符优先级
- 优先级就是先算什么后算什么
- 圆括号优先级最高
- 下表中故意不包含展开语法 —— 原因可以引用 Stack Overflow 上的一个回答,“展开语法不是一个运算符,因此没有优先级。它是数组字面量和函数调用(和对象字面量)语法的一部分。”
*本文为鲲游北冥的原创文章,著作权归本人和饥人谷所有,转载务必注明来源