小議 js 下字串比較大小

來源:互聯網
上載者:User

標籤:style   blog   http   color   java   io   2014   ar   

之前群裡有人問如何比較兩個時間大小,他的時間格式是 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

好了,今天的分享就這些了。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.