1.number运算
加减乘除:9/0 Infinity -5/0 -Infinity
余数:-1%7 -1
指数:**
自增自减:表达式a++的值是加之前的值,++a是加之后的值**(a在前,值为前,a在后,值为后)**
少用自增和自减,用a+=1,只在for循环里用a++
let a=1
++a
2
a++
2
a
3
求值运算符: + +(-8)//-8
负数运算符:- -(-8)//8
2.string运算符(只支持+)
连接运算符 +
对于数字+运算符,会把数字改运算符
对于数字-运算符,会把运算符改数字,因为只支持减号
所以不同运算符少运算一起
123+'123'
"123123"
123-'123'
0
3.比较运算符
js三位一体 ==
0=='0'
true
0==[]
true
0=='\t'
true
[]=='0'
false
[]=='\t'
false
'0'=='\t'
false
所以永远不要用==,用全等
x==y真值表难理解的几个点:
[]是真的,但是不等于true []==true //false
空数组是false,空对象却不是false
({})==false
false
[]==false
true
x===y真值表规则
-
相同类型看值是否相等
-
对象看地址是否相等,内存图
[]===[] false {}==={} false NaN===NaN false
4.布尔运算符
**防御性编程:**短路逻辑
防止不存在console报错,为假便停止,为真打下一个
console&&console.log&&console.log(‘hi’ )
console=undefined
console.log('hi')
VM1034:1 Uncaught TypeError: Cannot read property 'log' of undefined
at <anonymous>:1:9
(anonymous) @ VM1034:1
if(console){
console.log('hi')
}
console={}
if(console){
if(console.log){
console.log('hi')
}
}
a的保底值:
a||100 a保底值是100
解决空判断失误问题最新语法:主要是null和undefined为0
function add(n=0){
return n+1
}
add(null)
1
add(undefined)
1
add(’’)
“1”
function f1(n){
if(!n){n=0}
return n+1
}
undefined
function f1(n){
n||n+1
}
undefined
function add(n=0){
return n+1
}
undefined
5.二进制运算符
-
与运算 垂直运算,二进制数都为1才是1
(0b0001 & 0b1111).toString(2)
“1” 是0001 -
或运算 | 垂直运算,有一个1就是1,都是0才是0
0b0001
1
0b0001 |0b1111
15
(0b0001 |0b1111).toString(2) //用十进制转成二进制 字符串表示二进制
“1111” -
否运算 ~ 会以补码方式
规律:十进制结果+二进制数的十进制数的相反数=—1
例子:0b0011的10进制数为3, 3+(-4)=-1,所以结果十进制数为-4,转成二进制-0100
~0b0011
-4
(~0b0011).toString(2)
"-100"
- 异或 ^ 相同的为0,不同则为1
0b0001 ^0b1101
12
(0b0001 ^0b1101).toString(2)
"1100"
- 左移运算符<<和右移运算符 >> 二进制数
(0b0110 >>1).toString(2)
"11"
(0b0110 >>2).toString(2)
"1"
(0b0110 <<1).toString(2)
"1100"
-
头部补零的右移运算符>>>
正数下基本和右移一样
6.二进制运算符的运用
-
二进制运算符判断奇偶
1的最后一位是1,其余都是0,偶数最后一位是0,与1结合是0,因为都是1才为1
偶数&1=0
奇数&1=1
0b0001&1 1 0b0010&1 0
-
使用~~,>>,>>>,<<,|来取整
~~ 6.11
6
(~~ 6.11).toString(2)
"110"
6.83>>0
6
6.83>>>0
6
6.83<<0
6
6.83|0
6
-
用^来交换a,b的值 相同为0
常用:[a,b]=[b,a]
步骤:a=b;b=a;a^=b
a=0b0010 2 b=0b0110 6 a^=b 4 b^=a 2 a^=b 6 a 6 b 2
7.其他运算符
点运算符 .
对象.属性名=属性值 读取对象属性值
对于非对象,会转换成对象,例如Number对象,不要用Number\String\Boolean对象
他做了三件事:创建一个封装对象,封装对象来操作,然后滚了
var a=1
undefined
a.xxx='frank'
"frank"
a.xxx
undefined
//a.xxx用完被扔了
同理
a='1,2,3'
"1,2,3"
a.split(',')
(3) ["1", "2", "3"]
void运算符
void 语句/表达式
计算值或者执行语句,然后返回undefined
如:点击标签不跳转
<a href='javascript:;' onclick="console.log('hi')">百度一下<a>
逗号运算符
表达式1,表达式2,表达式3
如a=(1,2,3)
作用:把表达式n的值作为整体的值,如果是函数为返回值
a=(1,2,3)
3
a
3
实现箭头函数,不用return和{}执行两个语句,用逗号运算符
要用括号包住
let f=x=>(console.log('hi'),x*x)
f(2)
'hi'
4
8.运算符优先级
- 不同运算符
圆括号运算符优先级,逗号是最低的
因为运算符优先级太多了,常用括号把需要优先的括起来
!(a===1)
true
(!a)===1
false
a
2
- 相同运算符
从左到右:a+b+c
从右到左:a=b=c=d=2