下記のソースは、文字列を比較しているところです。
文字そのものを比較しているのではなく。unicodeの0と1が連なった数字を比較しているみたいですが、
単純に数字の大きさを比較しているのでしょうか。
javascript
1var s1 = 'abc'; 2var s2 = 'def'; 3 4console.log(s1 < s2);//true
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
正確には「互いが異なるコード単位(code unit)になる一番最初の位置でのそれぞれの**コード単位値(code unit vaul)**で比較」になります。そして、重要なことは、JavaScriptの文字列(string)はUnicodeそのものではなく、UTF-16でのコード単位値の配列として扱われていることです。
参考: ECMAScript 2015 Language Specification - 6.1.4 The String Type
ですので、U+10000〜U+10FFFFの拡張領域文字については、Unciodeの順番としては逆転することがあります。
JavaScript
1"use strict"; 2var a = "吉"; // U+5409 (code unit: 0x5409) 3var b = "A"; // U+FF21 (code unit: 0xFF21) 4var c = "????"; // U+20BB7 (code unit: 0xD842 0xDFB7) 5console.log(a < b); // true 6console.log(b < c); // not true, false 7console.log(c < a); // false
文字列の比較について、一方が一方のプリフィックスになるパターンを含めた全体の処理は下記のようになります。
(x < y の場合。前処理で x と y はそれぞれプリミティブ型にした px と px に入れられる)
- py が px のプリフィックスであれば、false を返す。 (p が q のプリフィックスとは、p に何からの r をくっつけることで p にできると言うこと。 r が空文字の場合も許されるので、常にあらゆる文字列はそれ自身のプリフィックスになる)
- px が py のプリフィックスであれば、true を返す。
- px の k 番目のコード単位と py の k 番目のコード単位が異なる、最小の k を求める。
- px の k 番目のコード単位値を m とする。(コード単位値は16bitの整数)
- py の k 番目のコード単位値を n とする。(コード単位値は16bitの整数)
- m < n なら true を返し、そうでなけば false を返す。
参考: ECMAScript 2015 Language Specification - 7.2.11 Abstract Relational Comparison
投稿2016/04/28 12:51
総合スコア21733
0
ベストアンサー
比較演算子の文字列比較
文字列比較の場合は前方から1文字ずつUnicodeポイントを比較します。
あくまでも1文字ずつ比較するので '10' > '2' === false
であり、人間が直感的に考える比較とは異なる点に注意が必要です。
比較演算子の擬似コード
JavaScript
1'use strict'; 2function compareStrings (string1, string2) { 3 string1 = String(string1); 4 string2 = String(string2); 5 6 if (string1 === string2) { 7 return '=='; 8 } 9 10 for (var i = 0, l = Math.min(string1.length, string2.length), code1, code2; i < l; ++i) { 11 code1 = string1.charCodeAt(i); 12 code2 = string2.charCodeAt(i); 13 14 if (code1 > code2) { 15 return '>'; 16 } else if (code1 < code2) { 17 return '<'; 18 } 19 } 20 21 return string1.length > string2.length ? '>' : '<'; 22} 23 24console.log('abc' < 'def'); // true 25console.log(compareStrings('abc', 'def')); // "<" 26console.log('10' > '2'); // false 27console.log(compareStrings('10', '2')); // "<" 28console.log('10' > '1'); // true 29console.log(compareStrings('10', '1')); // ">"
更新履歴
- 2016/04/28 21:21
compareStrings('10', '1') === '>'
になっていなかった不具合を修正
Re: aaaaaaaa さん
投稿2016/04/27 12:09
編集2016/04/28 12:24総合スコア18156
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/04/28 12:24
2016/05/02 11:25
0
https://msdn.microsoft.com/ja-jp/library/ky6fyhws(v=vs.94).aspx
- 文字列式を比較する場合、JavaScript では Unicode のコード順に基づいて比較します。
- 比較演算子の種類と値によって、expression1 と expression2 がどのように比較されるかを次に示します。
- 関係演算子: <、>、<=、>=
- expression1 と expression2 の両方を数値に変換しようとします。
- 式が両方とも文字列の場合は文字列比較が行われます。
こんな感じらしいです。
投稿2016/04/27 11:22
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。