34.相等、全等,隐式转换
leezozz 5/17/2023 js
# 相等 ==
相等操作符用于比较两个值是否相等。如果比较的两个值类型不同,JavaScript会尝试进行隐式转换,使它们具有相同的类型,然后再进行比较。这种隐式转换肯呢个会导致一些意外的结果。
# 隐式转换规则
在进行相等比较时,如果两个值的类型不同,则会进行以下隐式转换:
# 基本类型的隐式转换
- 如果一个值是布尔类型,另一个值是非布尔类型(除了null和undefined),则将布尔值转换为数值进行比较。
- 如果一个值是字符串类型,另一个值是数值类型、布尔类型或对象类型,则将字符串转换为数值进行比较。
- 如果一个值是对象类型,另一个值是字符串类型、数值类型或Symbol类型,则将对象转换为原始值(通过调用对象的valueOf() 或 toString() 方法)进行比较。
1 == '1'; // true,'1' 隐式转换为数值 1
true == 1; // true,true 隐式转换为数值 1
null == undefined; // true,null 和 undefined 是相等的
1
2
3
2
3
# 引用类型的隐式转换
- 字符串转换:引用类型的值在进行字符串转换时,会先调用 toString() 方法,将其转换为字符串。如果该方法不存在或返回的不是一个有效的字符串,则会继续调用 valueOf() 方法进行转换。
- 数值转换:引用类型的值在进行数值转换时,会先调用 valueOf() 方法,将其转换为数值。如果该方法返回的不是一个有效的数值,则会继续调用 toString() 方法进行转换。
- 布尔转换:引用类型的值在进行布尔转换时,始终会被视为真值,除非它的 valueOf() 方法返回的是 null 或 undefined,这时它会被视为假值。
# 全等 ===
- 全等操作符用于比较两个值是否严格相等,不会进行隐式转换。只有在两个值类型相同且值也相等的情况下,全等操作符才返回 true,否则返回 false。
- 全等操作符不会进行类型转换,因此它更加严格和精确。
1 === '1'; // false,类型不同
true === 1; // false,类型不同
null === undefined; // false,类型相同但值不同
1
2
3
2
3