为了账号安全,请及时绑定邮箱和手机立即绑定

宽松相等( == )与严格相等( === )

基本规则

1、比较基本类型值的时候,如果两个值的类型相同,就仅比较它们是否相等,此时,== 和 === 之间并没有什么不同;
2、如果类型不同,== 会将其中之一或两者都转换为相同的类型后再进行比较,而 === 不允许这样的转换发生。
3、比较引用类型值的时候,只要两个对象指向同一个值时即视为相等,不发生类型转换,因此使用== 或者 === 都是一样的。

*NaN 不等于 NaN,+0 等于 -0 需要特殊对待。

字符串和数字之间的相等比较

考虑下面的例子:

var a = 1;
var b = "1";
console.log(a === b); //输出:false
console.log(a == b); //输出:true

因为没有类型转换,所以 a === b 为 false;
而 a == b 是宽松相等,即如果两个值的类型不同,则对其中之一或两者都进行类型转换。ES5 规范定义了下面两条具体的转换规则:
(1) 如果 a 是数字,b 是字符串,则返回 a == Number(b) 的结果;
(2) 如果 a 是字符串,b 是数字,则返回 Number(a) == b 的结果。
根据规范,在进行 == 比较时,“1” 应该会被转换为数字以便进行相等比较。

其他类型和布尔类型之间的相等比较

考虑下面的例子:

var a = "520";
var b = true;
console.log(a == b); //输出:false

我们可能觉得"520"应该会被转换为 true ,然后和 b 进行比较,但实际情况并不是这样的。ES5 规范对于布尔值也定义了下面两条转换规则:
(1) 如果 a 是布尔类型,则返回 Number(a) == b 的结果;
(2) 如果 b 是布尔类型,则返回 a == Number(b) 的结果。
根据规范,在进行 == 比较时,true 被转换为 1,而"520" 根据规则被转换为 520,最后变成 1 == 520,结果为 false。

*这里面有一个惯性思维要捋清,字符串"520" 本身是可以被转换为布尔值 true ,但 “520” == true 这个表达式中,“520” 并没有发生布尔值的转换(隐式或显式转换都没有发生),而是 true 转换为 1,“520” 转换为 520。实际工作中,也要避免使用 == true 和 == false。

null 和 undefined 之间的相等比较

在 == 中,null 和 undefined 可以相互进行隐式类型转换, null 和 undefined 相等(它们也与其自身也相等),除此之外与其他值都不相等。

例子:

var a = null;
var b;
console.log(a == b); //输出:true
console.log(a == undefined); //输出:true
console.log(b == null); //输出:true

console.log(a == false); //输出:false
console.log(b == false); //输出:false
console.log(a == ""); //输出:false
console.log(b == ""); //输出:false
console.log(a == 0); //输出:false
console.log(b == 0); //输出:false

对象和非对象之间的相等比较

关于对象和基本类型之间的相等比较,ES5 做了如下规定:
(1) 如果 a 是字符串或数字,b 是对象,则返回 a == ToPrimitive(b) 的结果;
(2) 如果 a 是对象,b 是字符串或数字,则返回 ToPromitive(a) == b 的结果。

*如果是对象和布尔值之间的相等比较,布尔值会先被转换为数字。
*ToPrimitive() ,即对象的隐式转换:首先调用 valueOf() 方法,然后通过 toString() 方法将返回值转换为字符串。具体可参考:JavaScript隐式数据类型转换

例子:

var a = "520";
var b = [520];
console.log(a === b); //输出:false
//[520] 转换过程:[520] => "520" => 520
console.log(a == b); //输出:true

如有错误,欢迎指正,本人不胜感激。

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消