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

String #121

Closed
azu opened this issue Aug 9, 2016 · 38 comments · Fixed by #227
Closed

String #121

azu opened this issue Aug 9, 2016 · 38 comments · Fixed by #227

Comments

@azu
Copy link
Collaborator

azu commented Aug 9, 2016

#17 基本文法

Stringオブジェクト

@azu
Copy link
Collaborator Author

azu commented Aug 14, 2016

  • UTF-16
  • indexOf
  • includes
  • match 正規表現

@azu
Copy link
Collaborator Author

azu commented Oct 2, 2016

@yumetodo
Copy link
Contributor

yumetodo commented Oct 4, 2016

#106 はどうなりますかね?

@azu
Copy link
Collaborator Author

azu commented Oct 5, 2016

まだどうするか考え中な感じですが、StringとArrayを並べて考えようとしてます。
(実際に対比するというよりは、説明の流れを似せるだけという話ですが)
この2つは似ている部分と異なる部分があるので、似ている部分は似たような流れで紹介して、異なる部分は異なるということを示しながら進めるんじゃなかなーと思います。

似ている部分としては、追加、削除、探索(indexOf、includes)など
(似ているかと言われると微妙ですが、同じ名前のAPIだったり話の流れとしては似たようなものになるかもという直感的なものです)

異なる部分として、プリミティブと参照型だったり色々ありますが、
配列では array[n] でn番目の要素にアクセスできるけど、文字列では string[n] で n番目の文字とは?という話になると思います。(具体的には "🚧"[0] の結果はどうなる?とか)
ここで、Code Pointとか #106 の話がでてくるような気がします。

ただ、ちゃんと扱おうと思うとJavaScriptの標準APIでは微妙に足りない感じがするのでどこまで踏み込むかが微妙な感じです…
(Effective JavaScriptだと2ページぐらいでこの辺の話が書かれてて、これでもかなりすっきりとしてるなという印象なので、真面目に書くと結構たいへんそうだなと思っています)

というのをArrayのコード例を色々書いていて思った感じです。 #49

@azu
Copy link
Collaborator Author

azu commented Oct 28, 2016

Tagged Templateの課題で、safe property access とか結構面白いかもと思った(処理を限定させれば結構シンプルに書けるかも)
azu/azu#78

@azu
Copy link
Collaborator Author

azu commented Nov 16, 2016

@azu
Copy link
Collaborator Author

azu commented Nov 27, 2016

"𠮟る".length; // => 3
叱ると𠮟るがあるのか

@yumetodo
Copy link
Contributor

@azu
Copy link
Collaborator Author

azu commented Dec 9, 2016

@azu
Copy link
Collaborator Author

azu commented Jan 16, 2017

テンプレートリテラル ここに含めると微妙に関数が先にあって欲しいみたいなことがおきるんだな。

テンプレート文字列の概念をまとめると

  • テンプレート文字列
    • テンプレートリテラル
    • タグ付きテンプレートリテラル

という関係になるはず。
表記も統一しないと。

@laco0416 ↑の表記に統一かな? (個人的にはTemplate literalとかそのまま使うの好きだけど、中途半端になりそうだし)

@azu
Copy link
Collaborator Author

azu commented Jan 16, 2017

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/slice
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/substring

String#slice と String#substring ってどういう理由で2つあるんだろ?
JavaScriptの仕様的にどちらも破壊的じゃないし、同等のことは表現できるだろうし。
この使い分けってあるのかな?
(説明としてどちら(とも)を出すのかが迷う感じ)

@azu
Copy link
Collaborator Author

azu commented Jan 16, 2017

@azu
Copy link
Collaborator Author

azu commented Jan 16, 2017

sliceとsubstringの違いを出すには - をつかうケースで、典型的なのは0桁埋めだったけど、
今ならString#padStartで解決できてしまう ということに気づいてしまった。

@azu
Copy link
Collaborator Author

azu commented Jan 17, 2017

https://github.com/asciidwango/js-primer/blob/master/source/OUTLINE.md#string
この章のメインテーマとしては、目的の文字列を組み立てる方法を学ぶという所に集約しそう。
そのために文字とは何かとか文字列操作の方法とかを見ていく感じ。
(具体的に目的の文字列としていい感じのものがまだないけど。タグ付きテンプレートを説明しようと思ったら思った以上に難しかった)

@azu
Copy link
Collaborator Author

azu commented Jan 17, 2017

タグ付きテンプレートの典型的なユースケースはやっぱりHTMLエスケープなのかな。
Ajaxのところでも出てくるので、ここでは仕組みを上手く解説できるといいのだけど。
題材はHTMLエスケープ以外だとなんかいい感じのあるのかな

@azu
Copy link
Collaborator Author

azu commented Jan 19, 2017

Unicode周り 詳しくはMathiasさん参照みたいな感じになるかなー
combining marksあたりになると、物理的に印刷が正しくできるのか不安になるレベル。
(ECMAScriptの範疇じゃなくてUnicodeの話になってしまうし)

多くのケースでは直にこの問題を扱わないで、事前に正規化を書けて扱いやすくしたものを扱うはずなので、普通にプログラミングする範囲では知りたいときに調べる感じになるものだと思う。

combining marksはString#normalizeで正規化できないので、正しく説明するのが単純に難しい感じ。

code unit, code pointあたりは、JavaScriptのAPIとして扱う方法が存在するので、APIを使いつつ説明できる範囲にしておくのがちょうどいい感じかなと思った。

@yumetodo
Copy link
Contributor

いや、Unicodeを真面目に考えれば、正規化なんて甘えで、ひとつのコードポイントで一文字を表そうとするのが傲慢ということでは・・・。たまたま等価な(等価の定義がまた面倒)コードポイントひとつに変換できる場合の変換が正規化なのであって。
もちろんECMAScriptの範疇じゃなくなるので、正規化は例えば検索(比較)可能性の向上のために等価な文字を同じコードポイントで表すように変換するためにあるのであって、combining characterを1codepointで表すためのものではない、と言及するに留めるしかないと思いますが。

combining marksあたりになると、物理的に印刷が正しくできるのか不安になるレベル。

あ・・・

@azu azu mentioned this issue Jan 20, 2017
3 tasks
@azu
Copy link
Collaborator Author

azu commented Jan 22, 2017

いつも忘れるのでメモ。

var str = "x\uD83D\uDE80y";
console.log("\\u" + str.codePointAt(0).toString(16));
console.log("\\u" + str.codePointAt(1).toString(16));
console.log("\\u" + str.codePointAt(3).toString(16));
// code unit
console.log("\\u" + str.charCodeAt(0).toString(16));
console.log("\\u" + str.charCodeAt(1).toString(16));
console.log("\\u" + str.charCodeAt(2).toString(16));
console.log("\\u" + str.charCodeAt(3).toString(16));

via http://www.2ality.com/2015/01/es6-strings.html

@azu
Copy link
Collaborator Author

azu commented Feb 18, 2017

StringとRegExp 改めて仕様読んでてたけど、関係がもっと深いな。
String#methodはRegExp#[SymbolMethod]として使うことができるのか

https://tc39.github.io/ecma262/#sec-properties-of-the-regexp-prototype-object

"ab".split(/a*?/)
/a*?/[Symbol.split]("ab")

みたいにかける

@azu
Copy link
Collaborator Author

azu commented Feb 18, 2017

#183 これを書き直すといいのかも。
Symbolで対となる表現が存在するという話を書くだけ(実際には使わない)
関係性の深さを意識として置いておきたい。後将来的にSymbolの活用例として

@azu
Copy link
Collaborator Author

azu commented Feb 18, 2017

String#split

The value of separator may be an empty String. In this case, separator does not match the empty substring at the beginning or end of the input String, nor does it match the empty substring at the end of the previous separator match. If separator is the empty String, the String is split up into individual code unit elements; the length of the result array equals the length of the String, and each substring contains one code unit.

"文字列".split("").join("") は絵文字がきた段階で破綻する。
Array.fromや...でましになるけど、結合文字まで考えるとそこは自前でやる必要があるやつ。

@azu
Copy link
Collaborator Author

azu commented Feb 20, 2017

@azu
Copy link
Collaborator Author

azu commented Feb 20, 2017

文字数(正確にはcode point) みたいな言い回しするのが難しさを出してる感じがする

mu pdf viewer 2017-02-20 20-25-51

この辺はJavaScriptも後付のCode Pointなので似たような内容

mu pdf viewer 2017-02-20 20-27-54

@azu
Copy link
Collaborator Author

azu commented Feb 28, 2017

文字列の比較

https://github.com/asciidwango/js-primer/blob/master/source/OUTLINE.md#string
stringの比較は === ぐらいかな?
> < >= <= 一応書くけど、sortとセット以外で使わない感じがするな。
この辺の仕様を見て、そのアルゴリズムをJavaScriptで書いてみるのが分かりやすいのかな?

"100" > "20" ; // false

@azu
Copy link
Collaborator Author

azu commented Mar 1, 2017

String.prototype.localeCompare() - JavaScript | MDN
Intl.Collator.prototype.compare - JavaScript | MDN

i18nのcompareもそういえば今なら使えるのか。
i18n API自体がこなれてない感じなので、これを含めるか難しいな。(微妙に使えない環境あるし)

@azu
Copy link
Collaborator Author

azu commented Mar 1, 2017

文字列比較の === のアルゴリズム

If x and y are exactly the same sequence of code units (same length and same code units at corresponding indices), return true; otherwise, return false.
-- https://tc39.github.io/ecma262/#sec-samevaluenonnumber

なので、code unitが同じ並びになっていて同じ長さかというもの

@azu
Copy link
Collaborator Author

azu commented Mar 1, 2017

@azu
Copy link
Collaborator Author

azu commented Mar 1, 2017

http://qiita.com/teyosh/items/b126f21a16b795885067#intlcollator
言語によって文字列の比較結果は異なるため、i18nの機能を使ってL10Nをしないと求める結果は得ることができない。

@azu
Copy link
Collaborator Author

azu commented Mar 12, 2017

配列の場合は特定の要素を探すということをするが、文字列から特定の文字1つを探すということはあまりしない。

代わりに特定の文字の並びを探すということを行うため、その文字集合へのマッチ方法が重視されることが多い。そこで役立つのが文字集合を特殊文字として表現できる正規表現。

StringとRegExpは内部的に同じ処理を共有しているため、別のオブジェクトではあるがとても密接な存在である。

@azu
Copy link
Collaborator Author

azu commented Mar 13, 2017

Jonathan New | "💩".length === 2

❤️ のlengthの例

@azu
Copy link
Collaborator Author

azu commented Mar 18, 2017

カスタムタグテンプレート インデント消すやつとか、正規表現も混ざって面白いかも

stripIndent`
 class YourStore extends Store {
    getState(){
      return {
          yourStore: this.state
      };
    }
 }
`;

@azu
Copy link
Collaborator Author

azu commented Mar 19, 2017

i18nタグがいいかも?
数値の複数形とか

@azu
Copy link
Collaborator Author

azu commented Mar 22, 2017

文字単位の分割i18n APIの分かち書きでできるのかなー。
結合文字とかもいい感じに分割してくれるのかな

@azu
Copy link
Collaborator Author

azu commented Mar 29, 2017

@azu
Copy link
Collaborator Author

azu commented Apr 3, 2017

Regular Expressions in a post-ES6 world
named captureを踏まえて、execとかは単純な配列じゃないということを明記しておいたほうがいいのかも

@azu
Copy link
Collaborator Author

azu commented Apr 27, 2017

#225 構造的な文字列 = ドメイン固有言語的な表現にしたほうがいいかも。
URL文字列もドメイン固有言語といえるのかな。

@azu
Copy link
Collaborator Author

azu commented May 4, 2017

テンプレートリテラル周りの用語整理

Name Code
タグ関数(tag function) String.raw`template`
タグ付きテンプレート(Tagged Templates) String.raw`template`
テンプレートリテラル(Template Literals) `template`
テンプレート文字列(TemplateStrings) `template` (`の中の文字列)

8. Template literals 過去の仕様だとTemplte Stringが違う名前だったりしてややこしいけど、これであってるのかな?

@azu
Copy link
Collaborator Author

azu commented Aug 14, 2017

zeeshanu/learn-regex: Learn regex the easy way

正規表現について簡単にまとまっててよさそう。
リンクを追加するかなー

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants