抛砖引玉
按照正常的逻辑来说,我们判断两个值是否相等会遵循以下规则:
但是我看下面一组值:
居然没有按照我们的剧本走,那它比较规则又是什么?下面我就来分析一波。
“==”的比较规则
首先我们先去ECMAScript5.1中文版( http://lzw.me/pages/ecmascrip... )找一下“==”的比较规则,如下:
1.若Type(x)与Type(y)相同, 则
a.若Type(x)为Undefined, 返回true。
b.若Type(x)为Null, 返回true。
c.若Type(x)为Number, 则
i.若x为NaN, 返回false。
ii.若y为NaN, 返回false。
iii.若x与y为相等数值, 返回true。
iv.若x 为 +0 且 y为−0, 返回true。
v.若x 为 −0 且 y为+0, 返回true。
vi返回false。
d.若Type(x)为String, 则当x和y为完全相同的字符序列(长度相等且相同字符在相同位置)时返回true。 否则, 返回false。
e.若Type(x)为Boolean, 当x和y为同为true或者同为false时返回true。 否则, 返回false。
f.当x和y为引用同一对象时返回true。否则,返回false。
2.若x为null且y为undefined, 返回true。
3.若x为undefined且y为null, 返回true。
4.若Type(x) 为 Number 且 Type(y)为String, 返回comparison x == ToNumber(y)的结果。
5.若Type(x) 为 String 且 Type(y)为Number,返回比较ToNumber(x) == y的结果。
6.若Type(x)为Boolean, 返回比较ToNumber(x) == y的结果。
7.若Type(y)为Boolean, 返回比较x == ToNumber(y)的结果。
8.若Type(x)为String或Number,且Type(y)为Object,返回比较x == ToPrimitive(y)的结果。
9.若Type(x)为Object且Type(y)为String或Number, 返回比较ToPrimitive(x) == y的结果。
10.返回 false
看完ECMAScript5.1中文版的介绍之后,相信很多小伙伴的心情应该是这样的:
别看上面说的有点花里胡哨的,其实我们可以用很简单的话来总结出来。由于本篇文章核心是“==”是如何进行类型转换,我就总结一下类型不同的情况下“==”是如何比较的。
具体流程图如下:
备注:
Javascript的数据类型可以分为以下两种:
Boolean类型、String类型转换成Number类型的规则(ToNumber)
Boolean类型
Boolean | Number |
---|---|
true | 1 |
false | 0 |
String类型
标准的数字格式
如果是标准的数字格式,转换成Number类型相比不用多说,比如下面这几个栗子
注:相关教程知识阅读请移步到JavaScript/Ajax教程频道。
新闻热点
疑难解答