1. JS Bug
1.1 ==运算符
JS三位一体
永远不要使用JS中的==运算符,使用===代替
JS == 真值表
五个falsy值
一下这五个值会被转换为Boolean中的false值
- ''
- undefined
- NaN
- 0
- null
你无法预测js==会给你带来什么
1.2 使用===运算符
- 它基于两条规则基本类型看值是否相等
- 引用类型看地址是否相等
2. 防御性编程
在不确定当前的环境中某段代码是否能够使用的情况下确定每一环是确定存在的。
2.1 初级版本
if(console){
if(console.log){
console.log('hi')
}
}
2.2 升级版
console && console.log && console.log('hi')
2.3 目前还没有使用的js新语法
这种运算符叫做可选链
`console?.log?('hi')
3位运算
3.1 判断一个数的奇偶性
偶数 & 1 = 0 奇数 & 1 = 1
原理:将需要判断的数字的最后一位与1的二进制进行&运算。而&运算的规则是两个值相同返回1,不同返回0.
3.2 使用位运算来取整
- ~~ 6.11
将一个浮点数两次取反,由于位运算不支持小数这样一来就会得到一个整数
- 6.11>>0
- 6.11<<0
- 6.11>>>0
- 6.11 | 0
以上方法都是使用了位运算不支持小数的特点。
3.3 交换两数的值
let a = 10,b = 15
a ^= b
b ^= a
a ^= b
console.log(a,b)
利用异或运算符的特点,两个位相同位0,反之位1
4. 点运算符
点运算只能用在对象上,如果不是对象js会先把他变为一个对象。
理解下面代码
let num = 1
num.toString() // "1"
很显然num.toString()之后会得到一个字符串类型的。
**问题:**问题就在于num明明是普通的数组类型为什么辉有toString()方法呢?
原因: 其实在我们使用点运算符的时候js会先创建一个对应类型的临时包装类,比如代码中的数值类的包装类就Number对象,再从创建的Number对象中使用寻找对应的toString()方法。
注意这里创建的对象是临时的,在使用完之后就会自动回收。
证明创建的包装类是临时的
num.xxx = "hhh"
console.log(num.xxx)//undefinde
void 运算符
void 用于求表达式的值,或执行的返回值,void的值总时为undefined
<a href="javascript:void">xxx</a> //链接不跳转
正规的写法
<a href="javascript:;">xxx</a>
逗号运算符
逗号运算符可以做到将逗号后面最后一个表达式返回。通过这个特性就可以做到在箭头函数中不使用return 就能写两条以上语句。
let fn=(n)=>(console.log('hi'),n+1);
当然虽然可以写多条语句当时也不推荐写太多,不然会影响可读性
总结
js永远不要使用的运算符
-
==
-
基本类型的封装对象如 new Number()、 new String()、new Boolean()
-
++ 自增 使用 i+=1代替