#类型转换(关系运算符)
< > <= >= != !== == === (六种)
关系运算符的具有返回值,返回值是布尔类型,在对两个值进行比较时,可能需要进行类型转换
比较运算常用的地方:条件判断语句,函数、循环、分支语句
比较的两边数据类型相同:
都是字符串时: 将两边的字符转换成Unicode编码进行比较
都是数字: 进行值的大小比较即可
两边都是数组和对象(或者说两边都是引用类型): false ,一定是false,哪怕里面放的东西一样,但引用类型的地址不相同,结果一定不同
console.log( [] == []) //false console.log({a:1} == {a:1}) // false
都是布尔值: 比就完了,难道true还能等于false吗
两边的类型不相等:
先判断两边是不是字符串,有一侧不是字符串且两边的类型不同时,优先转换成数值
console.log(1 == "1") // true console.log(true == "true") // false console.log(true == "1") // true console.log(["a"] == "a") // true
- 当涉及到引用类型时,引用类型会先进行一步隐式转字符串,转换后再进行一次比较,如果另一边是字符串就进行字符串比较,不是则继续将两边转为数值比较
console.log([1] == "1") // true console.log([1] == 1) // true
NaN Undefined Null !
基本的比较规则如上,下面在来记忆几个特例
- NaN : 任何数据类型的值都不等于NaN,且NaN本身也不相等
console.log(NaN == Number("a")) //false console.log(NaN === NaN) // false
如何判断是不是NaN:
Object.is(value1 , value2) 他的效果和 === 是一样的 , 进行
value1 === value2
的判断,但是他可以判断NaN
,不会进行隐式转换console.log(Object.is(NaN , NaN))// true console.log(Object.is(Number("a") , NaN) // true
- isNaN(value) 这里面会进行隐式转换,所有的值都隐式转换为数值,转换后如果是NaN 返回true,否则返回false
console.log(isNaN(NaN)) // true console.log(isNaN("a")) // true
- Number.isNaN() 这里不会进行隐式转换,只会判断里面的值是不是NaN,是就返回true
Null Undefined
console.log(null == undefined) // true
- ! :取反,他会将其后面的值强制转换成布尔值,并取反
- 要注意的是在进行判断时,在转换成为布尔值时,引用类型直接转为true,不会再进行转字符串的隐式操作,还记得转换成布尔值为false的六个特例吗 false Null Undefined NaN 0 “”
- https://blog.csdn.net/yingzi0001/article/details/132768920?spm=1001.2014.3001.5501
还有一些 “0” == [] == [“0”] ==[0] == false == 0
== ===
- == 会有类型转换,同上面所写的
- === : 先进行类型判断,在进行值判断,不会设计类型转换