javascript --- > 抽象相等

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

var a = 42;
var b = "42";

a === b;  // false
a == b;  // true

ES5规范11.9.3.4-5定义如下:
(1)如果Type(x)是数字,Type(y)是字符串,则返回 x == ToNumber(y) 的结果
(2)如果Type(x)是字符串,Type(x)是数字,则返回 ToNumber(x) == y 的结果

// 总结:字符串和数字的比较是将字符串转换为数字然后再进行比较

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

var a = "42";
var b = true;

a == b;  // false

ES5规范11.9.3.6-7定义如下:
(1)如果Type(x)是布尔类型,则返回ToNumber(x) == y 的结果
(2)如果Type(y)是布尔类型,则返回x == ToNumber(y) 的结果

// 总结:布尔型和其他类型比较时,总是先将布尔型转换为数字类型

null和undefined之间的相等比较

var a = null;
var b;

a == b;     // true
a == null;  // true
b == null;  // true

a == false; // false
b == false; // false
a == "";    // false
b == "";    // false
a == 0;     // false
b == 0;     // false

ES5规范11.9.3.2-3规定:
(1)如果x为null,y为undefined,结果为true.
(2)如果x为undefined,y为null,结果为true.

// 总结: 在宽松相等(==)中,null和undefined可以相互进行强制类型转换

对象和非对象之间的比较

var a = 42;
var b= [42];

a == b; // true

ES5规范11.9.3.8-9规定:
(1)如果Type(x)是字符串或数字,Type(y)是对象,则返回 x== ToPrimitive(y)的结果;
(2)如果Type(x)是对象,Type(y)是字符串或数字,则返回 ToPrimitive(x) == y的结果.
 
// 总结:在对象与非对象的比较中,总是先使用ToPrmitive将对象转换为基本数据类型.
// 注:抽象ToPrimitive(参见ES5规范9.1节)会首先检查该值是否有valueOf()方法,如果有并且返回基本类型值,就使用该值进行强制类型转换.如果没有就
使用toString()的返回值来进行强制类型转换.

参考《你不知道的JavaScript》(中卷)P79~P83

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值