JS运算符及优先级

187 阅读3分钟

算数运算符

  • number运算
  1. 加减乘除

  2. 余数

-1 % 7的余数为 -1//提个负号,加 1 % 7的余数
//正常数学-1 % 7=== 6 % 7 的余数
  1. 指数
7 ** 2 //49
7 ** 3 //343
  1. 自增自减
a++//a在前,值为前
++a//a在后,值为后
  1. 求值运算符
var a = 8
+a
//8,+号后面取任何数,都是取这个数的值 

var a = - 8
+a
//-8
  1. 负数运算符
var a = - 8
-a
//8,正数变负数,负数变正数

string运算符

  • 连接运算
'1'+'2'
//"12",只支持加号

js独有:

1 +'2'
//"12",JS会将数字变成字符串再连接

'2' - 1
// 1 ,字符串不支持减号,JS会将字符串变成数字再运算

note:

  1. 少写自增自减
  2. 不同类型不要加起来

比较运算符

  1. ==

0 == []
0 == '0'
0 == '\t'
//ture,但右边三个互不相等

永远不要使用 == ,==自作聪明会自动类型转换,使用 === 。

  1. ===

    1. 基本类型看值是否相等
    2. 对象看地址是否相等

note:

NaN != NaN
[]===[]
//false,对象看地址
{}==={}
//false

布尔运算符

|| && !

console&&console.log&&console.log('hi')
//防止console被改写,不存在console报错

a = a || 100 
//100,a的保底值,可能有bug

function add(n =0){
    return n+1
}
//最新语法,保底值
add(null)
//1
add(undefined)
//1

二进制运算符

  • 或 | 与 & 否 ~(只能二进制运算)
0b11
//3
   
0b1111 | 0b1010
//15,结果会以十进制展示
(0b1111 | 0b1010).toString(2)
//"1111",二进制展示,两位比较都为0,结果为0,否则为1

(0b1111 & 0b1010).toString(2)
//"1010"两位比较都为1,结果为1,否则为0

(~0b1111).toString(2)
//"-10000"自动补一个1
  • 异或 ^

两个位相同,则结果为0,否则为1

(0b1111 ^ 0b1010).toString(2)
//"101"
  • 左移右移 << >>
(0b0010 >> 1 ).toString(2) 
// "1"
(0b0010 << 1 ).toString(2) 
// "100"
(0b0011 >> 1 ).toString(2) 
// "1" “吃掉”最右边的 1
(0b0011 << 1 ).toString(2) 
// "110"
  • 头部补零 的右移运算符 >>>
(0b1011 >>> 1 ).toString(2) 
// "101",正数的右移和头部补零的右移完全一样

使用与运算符判断奇偶

奇数 & 1 = 1 偶数 & 1 = 0

7 & 0b001
// 1 奇数

使用~,>>,<<,>>>,|取整

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 = 1
var b = 2
[a,b] = [b,a]
//a = 2,b = 1 
使用异或运算的原理(二进制)
var a = 5
var b = 2
a ^= b
b ^= a
a ^= b
console.log(a)//2
console.log(b)//5

点运算符

对象.属性名 = 属性名//读取对象的属性值

.只能用到对象上,而

var a = 1
a.toString()
 // "1" 

JS有特殊的逻辑,点前面不是对象,就封装成对象,一次性的,字符串也是。

  1. number会变成Number对象

  2. string会变成String对象

  3. bool会变成Boolean对象

  4. 程序员不用上面三类对象,只用简单类型

void运算符

void 表达式或语句
//求表达式的值,或执行语句,void的值总是undefined

需求:

< a heaf="http://baidu.com" onclick="console.log('hi');return false">baidu</a> 
//不跳转百度,且打印hi
或者
< a heaf="javascript:viod;" onclick="console.log('hi')">baidu</a> 

逗号运算符

(1,2,3)//值为3
let f = (x) => {
    console.log('hi')
    return x+1
}
可以改成:
let f = x => (
    console.log('hi'), x+1
)
//逗号一般配合括号使用

优先级问题

  • 不同运算符

一共20个运算符,圆括号优先级最高,剩下详细查看MDN文档运算符优先级

  • 相同运算符

从左到右 a + b + c 从右到左 a = b = c