拋磚引玉
按照正常的邏輯來說,我們判斷兩個值是否相等會遵循以下規則:
但是我看下面一組值:
[]==0 //true[]==false //true[]==!{} //true[10]==10 //true'0'==false //true''==0 //trueundefined==null //true !null==true //true
居然沒有按照我們的劇本走,那它比較規則又是什么?下面我就來分析一波。
“==”的比較規則
首先我們先去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教程頻道。
新聞熱點
疑難解答