asciidwango / js-primer

:book: JavaScript Primer - 迷わないための入門書
https://jsprimer.net
Creative Commons Attribution 4.0 International
2.34k stars 223 forks source link

欄外/コラム #102

Open azu opened 8 years ago

azu commented 8 years ago

入れる場所がない、関連する場所がない欄外的なコラムになりそうなまとめ場所。

メモ書きを書いておく場所なので、こういう話があると面白いのではという意見欲しい

azu commented 8 years ago

ECMAScriptとDOM APIの見分け方

これ確実な方法がないので、経験則や検索しろというのが答えになるけど、 ある程度の分別方法はある気はする。

『仕様ごとに覚えたらいい』って僕はよくいってます。整理しないでDOMとJavaScriptをまぜまぜに覚えていくとわけわからなくなっていくから。なんの仕様のなにをやろうとしているのかをはっきりさせた方がいいと思います。例えばJavaScriptを覚えたいんだったら、DOMとか忘れてJavaScriptだけを覚えた方がいいと思う。
-- JavaScriptビギナー編 | CodeGrid

を見ていてこういう話があると良さそう

azu commented 8 years ago

エラーの読み方

  • 読者が何で躓くのかをよく見る
  • 本当の初心者はエラー文を読まない/読めない(少なくても頻出するエラーパターンについては触れてもいい気がする)
  • 実行環境は一つに絞っていいが、どのようにデバックするのかは触れる必要が出てくる https://github.com/asciidwango/js-primer/tree/master/meetings/2016-01-29

どこかの章で エラーを実際に出してみてそれの読み方を書く。

93 エラーのキャッチ方法については try-catchでも扱うはずだけど、エラーは重要なので、単独で存在しててもいい気はする

JavaScript エラーリファレンス - JavaScript | MDN これを参照する

januswel commented 8 years ago

実行環境の話しがあると読む際により実感が得やすいかなと思いました。 オンラインで読む場合は jsFiddle で即時実行できるかと思いますが、紙面では何かガイドのようなものがあると嬉しいかと。

他には次のトピックが深掘りできるかと思います。

lacolaco commented 8 years ago

結局ブラウザで動かすことがメインになるので #9 の補足も含めて DOM based XSSの話とかあるといいのかなと思った

azu commented 8 years ago

パフォーマンス

32 演算子や #53 型変換において、動的言語にもかかわらず型を意識した書き方について紹介しています。

JavaScriptは動的型付け言語ですが、動的型付け言語だからといって型を無視して書くわけでありません。 型を意識して書くことで、暗黙的な変換のような意図しない挙動を減らせたり、パフォーマンスにおけるメリットが得られる可能性がでてきます。 JavaScriptという言語は、ブラウザベンダごとの複数の実装が競争しているという特殊なものといえます。 リファレンスとしての実装ではなく競合となる実装であり、また同じECMAScriptという仕様を元に実装しているため言語機能としての違いがあるわけではありません。

そのため、同じ機能において差を付けるために実行速度は重要視されています。

例えば、WebKitでは次の記事のようにパフォーマンスの低下はいかなる理由があっても入れる事ができないという話などもある程度です。 (これはパフォーマンスが低下する機能を入れる際は、どう程度パフォーマンスがあがるコミットもするという話でもあります。Chromeも同じ)

JavaScriptを書くことに置いてもブラウザ/JavaScriptエンジンが最大のパフォーマンスを発揮できるように書くことも大切な事と言えます。 このパフォーマンスを最大限発揮するという書き方は、多くの場合、暗黙的な型変換に頼らない、シグネチャーをダイナミックに変更しない、Shapeをダイナミックに変更しないといった型を意識したプログラミングにつながっています。

逆に、パフォーマンスを最大限発揮するコードを書くということは困難とも言えます。 理由としては、多種多様なJavaScriptエンジンと最適化手法が存在しているため、現時点では早いかもしれないが、その書き方は将来的に早いのかはまた別の問題となるためです。

このJavaScriptのパフォーマンスにおける一つの考え方としては、JavaScriptエンジンの最適化を妨げる書き方を避けるという事が、パフォーマンスの向上に繋がると考えられます。

そのため、最速のJavaScriptを目指すよりも、遅くならないJavaScriptの書き方を学ぶ方がメリットが大きいと思います。

azu commented 8 years ago

ESLintで学ぶプラクティス

azu commented 8 years ago

polyfill

azu commented 8 years ago

📝 パーフェクトJavaScript と Classesを読んでいて、思った内容

JavaScriptはES5までは動的言語の性質?を使う事が正しいことであり、prototypeを書き換える事が正しい方法だという主張もありました。 以前は動的に書き換える事ができる性質をより上手く利用するのを是としてデザインであったとも言えるかもしれません。

しかし、現在は別のclassなどより宣言的な方法が存在しているため、今後はそれが悪手となるかもしれません。 今現在もJavaScriptには色々な流派が存在し、絶対的な正しさを見出すことは難しいかも知れません。 なぜそのような色々な主張がJavaScriptにはあるのかを軽く考えてみます。

JavaScriptは不完全な言語であり続けますが、進化する不完全な言語です。 後方互換性のために過去の挙動を変える事や安易に増やす事が難しいため、不完全な部分は残り続けます。 そのため、新たな仕様を追加/変更する際にはよく議論され、最大限最小なものが加わります。 言い換えれば、ちょっとづつ進化していく言語です。

なぜ、進化し続けるのかというとウェブブラウザで動いている言語という側面は大きいでしょう。 ブラウザがより多くの処理をするために言語の上で拡張し、場合によっては言語そのものを拡張するしていくためです。 しかし、それらの拡張も仕様という形に落とされ、合意を得たものだけが残っています。 支配的な一つの独自拡張の繰り返しは、その後滅びるという歴史を繰り返してきたためです。 そのためウェブブラザも競争しあうことを良しとしています。

同様にJavaScriptも一つの支配的な書き方や実装方法があるわけではありません。 しかも、JavaScript自体も変化し続けています。 そのため、私たちはその時々においてのベストな書き方を学ばなければなりません。 歴史を学び、変化を追求し続けるのは一つの方針と言えるでしょう。

azu commented 8 years ago

Transpilerで学ばない

BabelのようなTranspilerの結果はあくまで擬似的な再現なので、その変換結果で学ぼうとはしないこと という話があると良さそう

azu commented 8 years ago

ブックマークレットとvoid

voidの説明をするならブックマークレットぐらいしかないレベル なんでjavascript:voidにvoidが必要なのか | MemeTodo

azu commented 8 years ago

控えめなJavaScript - Wikipedia