number运算
- 加
+减-乘*除/其中除法不能除以0,例如7/0为Infinity - 余数 (
x % 7)JS中负数有特殊情况,例外-1 % 7为-1,先执行1%7,再添加-到结果前面 - 指数
x ** 3例如3 ** 2意思是3的2次方为9 - 自增
x++ / ++x自减x-- / --x其中,自增的情况下,a在前,加a之前的值,a在后,加a之后的值。自减的情况和自加一样。
var a = 1;
a++ // 1 a++的值是a在运算加符号之前的值
a // 2
var a = 1
++a // 2 ++a的值是a在运算加符号之后的值
a // 2
- 求值运算符
+x
let a = 8
+a // 8 其中+运算符不是加的意思,是指求a的值的意思
- 负数运算符
+x
let a = -8
-a // 8 其中-运算符意思是把求得值转为相反的正负数
string运算
连接运算'123'+'456', 字符串中,只有+支持string运算
'1'+'2' // '12'
例如情况
在JS中,数字和字符串相加,会将数字转化为字符串,在进行连接。这是例外情况,在其他语言中会报错,只有Js会有这种奇葩情况
1 + '2' // "12"
在JS中,数字和字符串相减,会将字符串转化为数字,在进行想减。这是例外情况,在其他语言中会报错,只有Js会有这种奇葩情况
2 - '1' // 1
注意事项
- 尽量少用自增自减,让自己和别人都能理解你的代码
- 不要把不同类型的数据加起来,例如
1+'2'
比较运算符
><>=<======!=!==
注意事项1: JS 三位一体
永远不要使用==,使用===代替,因为==总是会自动进行类型转换
0 === []
0 === '0'
0 === '\t'
// 但是右边三个互相不相等
[] === '0' // false
'\t' === '0' // false
注意事项2: x == y真值表
[] == false 但不是 falsy
[] == false 但{}却不是
[[]] == false
注意事项3: x === y真值表
- 基本类型看值是不是相等
- 对象看地址是否相等
[]! == [] // 空数组不等于空数组
{}! == {} // 空对象不等于空对象
唯一的特例NaN! == NaN
布尔运算符
或且非
||&&!
短路逻辑
console && console.log && console.log('hi'),这样做的目的是,以防console不存在,报错。这种方法叫做'防御性编程',防止出错。a == a || 100,a的保底值为100,为了防止a的为falsey值,可以使用以下写法
function add(n=0){
return n+1
}
或与否
只对二进制有效
Ob11 // b后面的为二进制11,十进制为3
ob1111 | ob1010 // 依然为十进制的15
(ob1111 | 0b1010).toString(2) // 其中两两比较,有1就是1,否则为0, 转化为字符串后才显示二进制为"1111"
(ob1111 & 0b1010).toString(2) // 其中两两比较,两个都是1就是1,否则为0, 转化为字符串后才显示二进制为"1010"
(~ob1111).toString(2) // 其中1转为0,0转为1,转化为字符串后才显示二进制位"-10000"
异或
(0b1111 ^ 0b1010).toString(2) // 其中两两比较,相同则为0,否则为1,转化为字符串后才显示二进制位"0101",省略0则为"101"
左移<<和右移>>
(ob0010 >> 1).toString(2) // 将其中的数字右移1位,则为0b0001,转化为字符串后才显示二进制位"1"
(ob0011 >> 1).toString(2) // 将其中的数字右移1位,则为0b0001,把最右边的1吃掉,转化为字符串后才显示二进制位"1"
(ob0010 << 1).toString(2) // 将其中的数字左移1位,则为0b0100,转化为字符串后才显示二进制位"100"
(ob0011 << 1).toString(2) // 将其中的数字左移1位,则为0b0110,右边的为自动补全的0,转化为字符串后才显示二进制位"100"
头部补零的右移运算符 >>>
(ob1011 >>> 1).toString(2) // 将其中的数字左移1位,则为0b0101,左边的为自动补全的0,转化为字符串后才显示二进制位"101"
练习题目
问题1: 使用与运算符判断奇偶
让任意数字和二进制的1进行与运算,就得到结果,得出奇偶
方法:
7 % 2 === 1 // 奇数
7 & 0b001 = 1 // 奇数,如果7和二进制的1相等,则7为奇数
问题2:使用~,>>,<<,>>>, 来取整
console.log(~~ 6.83) // 6,两次取反,去除小数
console.log(6.83 >> 0) // 6, 右移一位,去除小数
console.log(6.86 << 0) // 6, 左移一位,去除小数
console.log(6.83 | 0) // 6, 得到自身,去除小数
console.log(6.83 >>> 0) // 6, 头部补零的右移运算符,去除小数
问题3: 使用^来交换ab的值
var a = 5
var b = 8
a ^=b
b ^=a
console.log(a) // 8
console.log(b) // 5
点符号
语法
对象.属性名 = 属性值
作用
读取对象的属性值
注意事项
如果不是对象,JS会把它封装成对象,number会变成number对象,string会变成string对象,bool会变成Boolean对象, 但是程序员从不使用这三种对象,只用简单类型
let a = 1
a.toString() // "1". a使用toString()方法后,变回数字。
a.toString() // 会报错
void运算符
语法
void表达式或语句
作用
求表达式的值,或执行语句。然后void的值总是为undefined
void console.log('hi') // hi, undefined
void 1 // undefined
void (1+1) // undefined
需求
<a href="http://example.com" onclick="f();return false;">点击</a>
设置return为假值,可以阻止默认动作,比如点击网页,阻止它跳转到网页地址
<a href="javascript: void(f())">文字</a>
这里也阻止了默认动作,和上面的是一样的作用
点运算符
语法
表达式1,表达式2,...表达式n
作用
将表达式n的值作为整体的值
作用
var a = (1,2) // a的值为2
(1,2,3,4) // 4
// 在这里,执行console.log语句,不写return,把x+1作为语句的返回值
let f = x =>(console.log('hi'), x+1)
f(1)
// hi
// 2
运算符优先级
不同运算符
1 + 2 * 3先算乘ji法,再算加法,结果为7!a === 1new Person().sayHi()
相同运算符
a+b+c从左到右计算a = b = c = d从右到左赋值
优先级汇总
- 圆括号优先级最高
面试技巧
坦言不记优先级,因为优先级太多了,需要很多时间来记忆难,就算我记好了,也不确定我的同事能把这些给记好,但是我会记得圆括号里的优先级最高,工作中需要运算符的话,我可以到时候再查找。