質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
String

Stringは、ゼロ以上の文字から連続してできた文字の集合を扱うデータ型です。基本的にテキストを表すために使われます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

3回答

1722閲覧

文字列型の比較

aaaaaaaa

総合スコア501

String

Stringは、ゼロ以上の文字から連続してできた文字の集合を扱うデータ型です。基本的にテキストを表すために使われます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2016/04/27 11:16

下記のソースは、文字列を比較しているところです。
文字そのものを比較しているのではなく。unicodeの0と1が連なった数字を比較しているみたいですが、
単純に数字の大きさを比較しているのでしょうか。

javascript

1var s1 = 'abc'; 2var s2 = 'def'; 3 4console.log(s1 < s2);//true

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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 に入れられる)

  1. py が px のプリフィックスであれば、false を返す。 (p が q のプリフィックスとは、p に何からの r をくっつけることで p にできると言うこと。 r が空文字の場合も許されるので、常にあらゆる文字列はそれ自身のプリフィックスになる)
  2. px が py のプリフィックスであれば、true を返す。
  3. px の k 番目のコード単位と py の k 番目のコード単位が異なる、最小の k を求める。
  4. px の k 番目のコード単位値を m とする。(コード単位値は16bitの整数)
  5. py の k 番目のコード単位値を n とする。(コード単位値は16bitの整数)
  6. m < n なら true を返し、そうでなけば false を返す。

参考: ECMAScript 2015 Language Specification - 7.2.11 Abstract Relational Comparison

投稿2016/04/28 12:51

raccy

総合スコア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
think49

総合スコア18156

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aaaaaaaa

2016/04/28 11:13

ご回答有難うございます。 一つずつ比較しているので10 < 2 は、1と2、0と2を比べて2のunicodeの方が大きかったのでfalseになったわけですね。 ところで10>2だとfalseになりますが、10 >1だとundefinedになってしまいます。 なぜ==が返ってこないのでしょうか。0も一緒比べていることが原因のような気もしますが、どうすると==が返ってくるのでしょうか。
think49

2016/04/28 12:24

'10' > '1' === true ですね。 親記事のコードを修正しました。
aaaaaaaa

2016/05/02 11:25

修正有難うございました。 10と2を比べるときは、2の方がunicodeが大きいので問題ないですが、 文字列である10と1を比べるときは、unicodeではなく文字の多さで優劣をつけるのですね。 てっきりelse if (code1 === code2) { return '==★'; } というソースになるのかと思ってました。 とても勉強になります。
guest

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

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問