默认类型转换
一般对于a和b两个元素进行比较时,通常会采用a==b/a===b
而a===b在比较时,当二者类型不同,会默认返回false
那么a==b如何进行判断呢?
回顾:
JavaScript基本数据类型:
Number、Null、Undefined、Boolean、String、Symbol、BigInt
JavaScript引用(复杂)数据类型:
Object
参考:ECMAScript官方文档
1.x和y类型相同
Type(x)为Undefined
return true
Type(x)为null
return true
Type(x)为Number
- Type(x)/Type(y)为NaN,返回false
- x和y的数值相同,return true
- x +0 y -0 return false
- x -0 y +0 return false
- 除此以外 均返回false(如二者的值不同)
Type(x)为String
要y和x长度及对应位置的元素一一对应才行,比如说
let x = "123";
let y = "123";
let z = "1234";
console.log(x==y) //true
console.log(x==z) //false
Type(x)为Boolean
x和y的逻辑值相同即可
Type(x)为Object
如果x和y指向的对象相同,返回true
x和y一个是null,一个是undefined
return true
x和y一个是Number,一个是String
将String的元素转化为Number后,如果二者的值相同,return true
否则return false
比如:
let x = "123";
let y = 123;
console.log(x==y) //true
x和y有一个是Boolean
将Boolean元素变为Number,之后和另一个元素进行比较
x和y 有一个是对象 另一个是String/Number
假设x为String,y为Object
返回的结果 x == ToPrimitive(y)
ToPrimitive函数 如果是基本数据类型 不会改变值
除此以外的情况
均返回false
我们通常会不了解,为什么"" == undefined进行比较的时候,返回的结果是false?
通常网上的文章会说 把所有元素都转换为Number元素进行比较,但是显然如果""和undefined均转换为Number的时候,二者都是0
这里我们可以通过ToPrimitive函数进行理解
""和Undefined都是基本数据类型 所以经过ToPrimitive函数之后(可以看上图),二者都不会改变,显然他们两个不相同,所以返回的就是false啦
总结
当x和y类型相同的时候,看他们两个具体是否相同就OK了
Null和Undefined是特殊的 单独记
存在Number+String/Boolean+其他的 把两个元素转换成数字进行比较就可以
剩下的都通过ToPrimitive函数进行比较