之前群里有人問如何比較兩個時間大小,他的時間格式是 2014-08-08 而不是 2014-8-8。
所以我給的方法是 直接比較,如:
var a = "2014-08-08"; var b = "2014-09-09"; console.log(a>b, a<b); // false true
很方便不是么,但是原理是什么呢?
打開 ECMA 第 11.8.5 節 The Abstract Relational Comparison Algorithm
在 4. Else, both px and py are Strings 處可以看到字符串比較的情況。
或者翻開 V8 簡單看下,在 COMPARE 處,
if (IS_STRING(this)) { if (IS_STRING(x)) return %_StringCompare(this, x); if (IS_UNDEFINED(x)) return ncr; left = this; }
可以看到調用了 %_StringCompare,然后打開這個函數C++源碼,(反正我是看不懂,就簡單看看而已)
可以看到他一開始不知道比較什么東西,如果成立就相等,那函數我找到源碼也沒看懂什么意思,水平太水了,沒辦法。
直接如果字符串長度是0的情況,就可以直接比較出大小。
最后才是關鍵,按每個字符的 charCode 大小進行比較,直到分出大小為止。
舉個例子 a="", b=""; 那么執行 a > b 因為長度都是 0 ,所以在長度比較的時候就得到結果了。
如果 a="a11", b="a2"; 那么 a>b 會得到什么結果呢?
var a="a11", b="a2"; console.log(a>b, a<b);
如果有字符進行比較就不是比長度了,而是按字符逐個進行比較,知道分出大小為止。
a>b 比較,步驟是這樣的:
1. a[0]=>"a", b[0]=>"a", 他們 charCode 相等,所以比較下一個。
2. a[1]=>"1", b[1]=>"2", 1 charCode 是 49,2 是 50 ,所以 a[1] 小於 b[1]
差不多就重復這樣的步驟進行對比,直到分出大小或者全部對比結束為止。
而不簡單的比較字符串長度。
一句話概括就是按照字典序進行對比。
所以剛才的問題,如果日期格式合適的情況下,直接比較是最方便的啦。
說到這里,我想起心姐的一篇文章《從字典系排列算法證明選擇大於努力》
console.log('選擇'>'努力'); // true
因為 "選" 的 charCode 是 36873,"努" 的 charCode 是 21162
好了,今天的分享就這些了。