默认类型转换“x==y”总结

165 阅读2分钟

默认类型转换

一般对于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函数 如果是基本数据类型 不会改变值

image.png

除此以外的情况

均返回false
我们通常会不了解,为什么"" == undefined进行比较的时候,返回的结果是false?
通常网上的文章会说 把所有元素都转换为Number元素进行比较,但是显然如果""和undefined均转换为Number的时候,二者都是0
这里我们可以通过ToPrimitive函数进行理解
""和Undefined都是基本数据类型 所以经过ToPrimitive函数之后(可以看上图),二者都不会改变,显然他们两个不相同,所以返回的就是false啦

总结

当x和y类型相同的时候,看他们两个具体是否相同就OK了
Null和Undefined是特殊的 单独记
存在Number+String/Boolean+其他的 把两个元素转换成数字进行比较就可以
剩下的都通过ToPrimitive函数进行比较