Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(string): 文字列の比較 #194

Merged
merged 10 commits into from
Mar 18, 2017
Merged

feat(string): 文字列の比較 #194

merged 10 commits into from
Mar 18, 2017

Conversation

azu
Copy link
Collaborator

@azu azu commented Mar 2, 2017

文字列の比較

  • ===
  • 大なり小なり演算子
  • 国際化と地域化

#121

"JS" === "ES"; // => false
```

この比較演算子による文字列比較は、次のような比較が行われています。
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

何か言い回しが奇妙

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

この時、同じ文字列は次を満たすものとして定義されます

とか?(さらに硬い)

- 文字列の要素であるCode Unitが同じ順番で並んでいる
- オペランドの文字列は同じ長さである

同様に`>`や`<`などの比較演算子で文字列同士を比較することもできます。
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

これ > とか < をまとめた用語ってあるっけ?
=== を除いた比較演算子

この比較演算子による文字列比較は、次のような比較が行われています。

- 文字列の要素であるCode Unitが同じ順番で並んでいる
- オペランドの文字列は同じ長さである
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

この時 true となるという雰囲気を伝えたい

Copy link
Collaborator Author

@azu azu left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ちょっと国際化APIを絡ませたせいで難しくなりすぎている。

+このように、JavaScriptの文字列比較はCode Unitがベースとなります。

までで終わらせてしまうのもありかな

"ABC" > "ABD"; // => false
```

文字列同士に対する`>`(大なり演算子)は次のような処理が行われていると考えられます。
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

行われています。

と言い切っ他方がよさそう

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

それは規格で何か言っていたりしますか?

```

文字列の比較においては、単純な比較であれば、`===`(厳密比較演算子)や`>`(大なり演算子)を利用します。
その国においてのより自然な形を求める場合は、地域化するために国際化APIなどを利用できます。
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

地域化するために国際化APIなどを利用できます。

これって用語として正しい?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

地域化

localizationと言ってしまう方が通じるのではという思い。internationalizationの訳としての国際化は定着してるけど、localizationの訳としての地域化は定着していない気がする。

WIkipediaには国際化と地域化という記事がありますが、これは最初の翻訳のときにとりあえず地域化と訳して、特に変えるほどの必要性に迫られなかったためそのままにしているようです。(というよりソフトウェア工学じゃない国際化を書こうとしたユーザーとの編集合戦でそれどころではなかった模様)

https://ja.wikipedia.org/wiki/%E3%83%8E%E3%83%BC%E3%83%88:%E5%9B%BD%E9%9A%9B%E5%8C%96%E3%81%A8%E5%9C%B0%E5%9F%9F%E5%8C%96#.E5.90.8D.E7.A7.B0.E3.81.AB.E3.81.A4.E3.81.84.E3.81.A6

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

なるほど。
たしかにローカライズの方が分かりやすいですね。(最初そっちで書いてたのですが、漢字に揃えたほうが分かりやすいのかなーと思って地域化にしちゃってました)

また、文字列の並びは国ごとの言語によって異なる場合があります。
このように、Code Unitの比較は必ずしも期待する結果とは異なる場合があります。

このように文字列の処理は、国ごとに自然となる形が異なるため、地域化(ローカライズ)する必要があります。
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

この辺リズムが良くないので治す必要がありそう

"このように" が連続している

このように文字列の処理は、国ごとに自然となる形が異なるため、地域化(ローカライズ)する必要があります。
JavaScriptでは、ECMAScriptの関連仕様として国際化APIが用意されています。

この書籍では詳しく紹介しませんが、国際化APIは`Intl`オブジェクトにあり、言語に依存した整形や比較などが利用できます。
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

多分、紹介するの難しい気がするんだよなー

// 文字列を対象にした > の実装
function largeThan(a, b) {
// Code Unitごとに1つづつ > で比較する
return a.split("").some((codeUnit, index) => {
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

split("") のイディオムをあえて使うべきか迷うな

この書籍では詳しく紹介しませんが、国際化APIは`Intl`オブジェクトにあり、言語に依存した整形や比較などが利用できます。
`Intl`オブジェクトはECMAScriptの関連する仕様という立ち位置であるため、すべての実行環境で実装されているわけではありません。

ブラウザにおけるサポート状況については[Can I use...][]で見ることができます。
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

他にいいまとめサイトあるかな?

"JS" === "ES"; // => false
```

この比較演算子による文字列比較は、次のような比較が行われています。
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

この時、同じ文字列は次を満たすものとして定義されます

とか?(さらに硬い)

"ABC" > "ABD"; // => false
```

文字列同士に対する`>`(大なり演算子)は次のような処理が行われていると考えられます。
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

それは規格で何か言っていたりしますか?

"10" < "2";// => true
```

また、文字列の並びは国ごとの言語によって異なる場合があります。
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ロケールと言語は一致しないので誤りでは?(en_USとen_GBが反例)

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

それは規格で何か言っていたりしますか?

https://tc39.github.io/ecma262/#sec-abstract-relational-comparison

ただあんまり正確ではない気がしています。
意図としては、先頭から異なる文字(Code Unit)同士を比較するという処理なので、 "10" > "2" // false みたいなことがありますよということを示したいコードですね。
(正直いらないかなと思ってきました)

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ロケールと言語は一致しないので誤りでは?

地域や言語によって

かな。(国もおかしいなケースがありそうなので)

```

文字列の比較においては、単純な比較であれば、`===`(厳密比較演算子)や`>`(大なり演算子)を利用します。
その国においてのより自然な形を求める場合は、地域化するために国際化APIなどを利用できます。
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

地域化

localizationと言ってしまう方が通じるのではという思い。internationalizationの訳としての国際化は定着してるけど、localizationの訳としての地域化は定着していない気がする。

WIkipediaには国際化と地域化という記事がありますが、これは最初の翻訳のときにとりあえず地域化と訳して、特に変えるほどの必要性に迫られなかったためそのままにしているようです。(というよりソフトウェア工学じゃない国際化を書こうとしたユーザーとの編集合戦でそれどころではなかった模様)

https://ja.wikipedia.org/wiki/%E3%83%8E%E3%83%BC%E3%83%88:%E5%9B%BD%E9%9A%9B%E5%8C%96%E3%81%A8%E5%9C%B0%E5%9F%9F%E5%8C%96#.E5.90.8D.E7.A7.B0.E3.81.AB.E3.81.A4.E3.81.84.E3.81.A6

@azu azu force-pushed the string-compare branch from 5da4937 to b10c16f Compare March 15, 2017 10:39
@azu azu merged commit 9cc5c0d into master Mar 18, 2017
@azu azu deleted the string-compare branch March 18, 2017 08:12
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants