等于==
、不等于!=
首先会判断两者类型,相同直接比较是否全等,类型不相同的话,就会进行类型转换,按以下规则:
- 布尔->数值
- 字符+数值->数值
- 对象->valueof
- null==undefined
- 遇到NaN直接不等
全等===
不全等!==
类型不相同时不会转换类型,直接返回false
- null===undefined //true
Object.is()
除了特殊情况一般和===相同
- Object.is(NaN,NaN) //true
- Object.is(0,-0) //false
转为数值
- null->0
- undefined->NaN
- true->1 false->0
- 数字字符串->数字
- 字符串包含非数字->NaN
- ""->0
- Symbol->报错
- 对象->valueOf()??toString() []->0 [1]->1 [1,1]->NaN {}->NaN
转为布尔
记住以下false假值:
- undefined
- null
- +0、-0
- NaN
转为字符串
- null->"null"
- undefined->"undefined"
- true->"true"、false->"false"
- 数值->"数值"
- 对象->toString()方法,该方法会被重写,未重写Object.prototype.toString->"[object 具体类型]"
- Symbol->只能强制转换,隐式转换报错
加法
数值+数值:
- NaN+*=NaN
- Infinity+-Infinity=NaN
- -Infinity+-Infinity=-Infinity
- -0+-0=-0
- 0+-0=0
只要有一个操作数是字符串,则转换为字符串进行拼接 - []+{}="[object Object]" {}+[]=0
减法
- NaN-*=NaN
- Infinity-Infinity=NaN
- -Infinity--Infinity=NaN
- 操作数是字符串、布尔、null、undefined->数值
- 对象->valueOf()??toString()
>和<
- 字符串比较->逐个比较字母编码
- 有一个是数值->将另一个转为数值
- 对象-》valueof().toString()
- 布尔->数值
- NaN->返回false
valueOf()、toString()
- [1,'a'].valueOf() -> [1,'a']
- [1,'a'].toString() -> '1,a'
- {}.valueOf() -> {}
- {}.toString() -> '[Object Object]'
arguments
在严格模式或使用...args
的的情况下arguments不再追踪参数的变化。