小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
JavaScript中操作符有很多,你都知道嘛?
- 一元操作符
- 位操作符
- 布尔操作符
- 乘性操作符
- 指数操作符
- 加性操作符
- 关系操作符
- 相等操作符
- 条件操作符
- 赋值操作符
- 逗号操作符
一元操作符
- 递增/递减操作符
let age = 30
++ age
let age2 = 30
-- age2
等于
let age = 30
age = age + 1
let age = 30
age = age - 1
无论是前缀增加还是递减,变量的值都会在语句被求值前改变! 副作用
let age = 30
let newage = --age + 2
console.log(age) //29
console.log(newage) // 31
在这个里面,递减先执行,因为它们会在语句求值前先执行!
- 递增和递减后缀(++ , --)放在变量后面,区别在于,求值后才发生
let num1 = 2
let num2 = 20
let num3 = num1-- + num2
let num4 = num1 + num2
console.log(num3) //22
console.log(num4) //21
- 一元加和减 应用到非数值的时候,会执行和使用Number()转型函数一样的类型转换,字符串根据特殊规则解析,对象会调用它们的valueOf()或者toString()方法
let s1 = "01"
let s2 = "1.1"
let s3 = "z"
let s4 = false
let s5 = {
valueOf(){ -1 }
}
s1 = +s1 //数值1
s2 = +s2 //数值1.1
s3 = +s3 //NaN
s4 = +s4 //数值0
s5 = +s5 //值变成-1
减号(-),放在变量前面,主要用于把数值变成负数,转换规则和+一样
let num = 25
num = -num
console.log(num) //-25
位操作符
- 按位非(~),返回数值的一补数
let num = 25 // 011001
let num2 = ~num // 100110
console.log(num2) // -26
等于
let num = 25
let num2 = -num - 1
console.log(num2) //-26
虽然两者结果相同,但是位操作速度快得多
- 按位与(&)
| 第一个数值的位 | 第二个数值的位 | 结果 |
|---|---|---|
| 1 | 1 | 1 |
| 1 | 0 | 0 |
| 0 | 1 | 0 |
| 0 | 0 | 0 |
按位与操作在两个位都是1才返回1,在然后一位是0都返回0
let result = 25 & 3
console.log(result) //1
计算过程
25 = 011001
3 = 000011
------------
000001
- 按位或(|) | 第一个数值的位 | 第二个数值的位 | 结果 | | --- | --- | --- | | 1 | 1 | 1 | | 1 | 0 | 1 | | 0 | 1 | 1 | | 0 | 0 | 0 |
按位或操作在至少一位是1的时候返回1,两位是0的时候返回0
let result = 25 | 3
console.log(reuslt) //27
计算过程
25 = 011001
3 = 000011
------------
011011
- 按位异或(^) | 第一个数值的位 | 第二个数值的位 | 结果 | | --- | --- | --- | | 1 | 1 | 0 | | 1 | 0 | 1 | | 0 | 1 | 1 | | 0 | 0 | 0 |
按位或操作在至少一位是1的时候返回1,两位是(1或者0)的时候返回0
let result = 25 ^ 3
console.log(reuslt) //26
计算过程
25 = 011001
3 = 000011
------------
011010
- 左移(<<)
let result = 2 //10
let result2 = result << 5 //1000000,十进制64
位移后,数值右端会空出五位,以0填充
- 右移(>>)
let result = 64 //1000000
let result2 = result >> 5 //10,十进制64
同样,位移后出现空位,不过右移空位会出现在左侧
布尔操作符
- 逻辑非(!) 取反
console.log(!false); //true
console.log(!"bule"); //false
console.log(!0); //true
console.log(!""); //true
console.log(!NaN); //true
console.log(!123); //flase
- 逻辑与 (&&) | 第一个数值的位 | 第二个数值的位 | 结果 | | --- | --- | --- | | true | true | true | | true | flase | false | | flase | true | false | | false | false | false |
如果第一个操作符是false,那么无论第二个操作符是什么值,结果也不可能等于true
let found = true
let result = (found && one) //报错,一个one没有定义
console.log(result) //不会执行
let found = false
let result = (found && one) //不报错
console.log(result) //会执行
- 逻辑或(||) | 第一个数值的位 | 第二个数值的位 | 结果 | | --- | --- | --- | | true | true | true | | true | flase | true | | flase | true | true | | false | false | false |
let found = true
let result = (found && one) //不报错
console.log(result) //会执行
let found = false
let result = (found && one) //报错
console.log(result) //不会执行
指数操作符
console.log(Math.pow(3,2)) //9
console.log(3 ** 2) //9
let result - 3
reuslt **= 2
console.log(result) //9
逗号操作符
逗号操作符可以用了在一条语句执行多个操作
let num = 1,num2 = 2, num3 = 3
let num = (5,4,3,2,1) //1
//用逗号操作符分隔值,最终会返回表达式的最后一个值