宽松相等(==) 的转换规则(仅考虑基本数据类型)

发布于:2025-05-24 ⋅ 阅读:(25) ⋅ 点赞:(0)

在js中,比较两个变量是否相等常见的方法有两种,一个是宽松相等“==”,另一个是严格相等"==="。

这两个的区别在于:

        宽松相等:仅比较值是否相等,并且会进行一定的类型隐式转换,将两侧转换为相同类型后再比较。

        严格相等:比较值和地址是否都相等,不会进行类型转换。

而在使用宽松相等时,类型的转换却有些难以把握。比如:

console.log(1=='1')//true

console.log(1=='a')//false

console.log(true=='true')//false

console.log(false=="")//true

我们都知道,空字符串、false、0、undefined、null转换为布尔类型都是false,其他转成布尔类型都是true。但是从上面几个例子中可以看到,好像并不是这么回事,比如true==’true‘,按照转换规则来说应该是true,但是打印出的确实false。下面就是一些通过学习、查询和测试得到的一些规则。

规律总结:

1.当类型相同时,值相同则为true,不同则为false,Symbol类型除外,Symbol类型比较都会输出false,因为Symbol表示的每个都是唯一值

2.当类型不同时:

2.1.如果布尔类型和字符串或数字相比,true会被转换成1,false会被转换为0;字符串会尝试转换为数字,不能转换则为NaN,然后比较转换后的数字。

console.log(true=='1')//true
console.log(true=='2')//false
console.log(true=='0')//false
console.log(true=='')//false
console.log(false=='')//true
console.log(false=='0')//true
console.log(false=='1')//false
console.log(true==0)//false
console.log(true==1)//true
console.log(false==0)//true
console.log(false==1)//false

2.2.如果比较双方一个是数字,一个是字符串,那么会尝试将字符串转换为数字,如果不能转换为数字则会转换为NaN,然后比较转换后的数字

console.log(1=='1')//true
console.log(1=='2')//false
console.log(1=='0')//false
console.log(1=='a')//false
console.log(0=='0')//true
console.log(0=='1')//false
console.log(0=='2')//false
console.log(0=='a')//false
console.log(2=='0')//false
console.log(2=='1')//false
console.log(2=='2')//true
console.log(2=='a')//false

2.3.null、undefined和Symbol:null与undefined比较为true(js中一个特殊规则),null、undefined、Symbol与其他类型比较均为false。