エスケープ表記https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String#Escape_notation演算子https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators算術演算について、誤差により計算結果が期待通りにならない場合があるので注意しましょう。整数にしてから計算したり、ライブラリを利用して対処します。様々な繰り返し処理の説明はこちら。ES2015でfor...ofが導入されました。for...ofは、反復可能オブジェクト(配列、Map、Set、argumentsのような配列ライクなオブジェクト、イテレータやジェネレータ)のプロパティを順に処理します。ケンシロウfor...ofはプロパティの値に対して処理を行う一方、for...inはプロパティ名に対して処理を行います。for...ofは値を相手にするのに対して、for...inは参照も相手にします。whoAmIループからの脱出にはbreakやlabelを使います。以下のコードは等価です。'キルア');連想配列については後述します。ES2015で値の取り出しが便利になりました。assignment(分割代入)の使い方はこちら。オブジェクト(後述)にも適用できます。意味にいくつかの変更を加えます。エラーではないが落とし穴になる一部の事柄を、エラーが発生するように変更することで除去します。モードにあまり最適化していませんが、将来のバージョンで実現するでしょう)。定義される予定の構文を禁止します。MDN何がうれしいか、使い方、使用上の注意はこちら。60.8.0esrや72.0.2)で確認したものです。2015(以降、ES2015と呼称)でSymbol型が追加されて8つの型が定義されています。Java等とは違い、変数の宣言時に型を明示しない。いずれかと共に変数(定数)を宣言する。(後述)型変換に要注意。参考資料:型変換のいろいろ演算にまつわる型変換(キャスト)+と-の違いに注目。==はオペランドの型が異なる場合、キャスト後に評価する。===はキャストせず評価する。Browne1型を判定する方法がいくつかあります。参考資料:JavaScriptの「型」の判定についてSymbol型は、ぱっとみ意味が分からないですね。変数のスコープJavaScriptにはかつて、2つのスコープがありました。関数内でのみアクセス可能な、ローカルスコープ。どこからでもアクセス可能な、グローバルスコープ。ES2015で1つ追加されました。ifやforなどの{}の内側でのみアクセス可能な、ブロックスコープ。(ローカルスコープを関数スコープとブロックスコープに分て考えるようになったっぽい。付けずに宣言した変数はグローバルスコープ。付けた場合、宣言した場所による。関数内で宣言した場合、関数スコープ。ない場合、グローバルスコープ。付けた場合、宣言した場所がスコープになる。関数の(値渡しした)引数は関数スコープ。v-globalちなみに、letが無かった時代には、withを用いたテクニックを使ってブロックスコープを実現していました。withの使用は推奨されません。varの使い分けについては、左から順に優先して使えばよさそうです。変数を書き換える(変数から取り出した値を加工して入れ直す)場合、加工してるので別名の変数に格納すべきと考えられ、ゆえにconstで事足りそうです。for中のiのように繰り返し上書きする場合にはletが使えそうです。多くの場合、varは不要なはずです。スコープチェーンについても理解する必要がありますが、まずはJavaScriptのオブジェクト(後述)を理解するのが先です。参考資料:tacamy--blogHoisting(巻き上げ)https://developer.mozilla.org/en-US/docs/Glossary/Hoistingvarの巻き上げローカル変数は、スコープの冒頭で宣言、初期化するのが無難なようです。scope;が宣言されたと解釈される。scopeにはまだ値が入っていないためundefinedとなる。g関数の巻き上げ<script>は何度でも埋め込むことができますが、同一スコープ中で関数を定義、使用する場合、どちらを先に書いても構いません。定義する<script>と使用する<script>が異る場合、先に定義しておく必要があります。関数式の巻き上げ巻き上げません。定義する前に関数式を使用できません。変数と考えれば自然な挙動ですね。ネームスペースを作成する考え方はシンプルです。グローバルオブジェクトをひとつ作成して、すべての変数、メソッド、関数をそのオブジェクトのプロパティとすればよいのです。ネームスペースを使用すると、アプリケーション内で名前が衝突する可能性が低下します。これは各アプリケーションのオブジェクトが、アプリケーションで定義したグローバルオブジェクトのプロパティとなるからです。MDNスコープや名前空間に付随するあれこれJavaScriptには元々スコープが2つしかなく、モジュール(後述)にも非対応だった等の理由から、変数の汚染(意図せずに変数を上書きしてしまう事故)を防ぐためのテクニックが活用されていました。いう仕組みがありましたが、役割を終えた感があります現時点の言語仕様で、もっといい書き方ができないか吟味するのが良さそうです。参考資料:JavaScriptで即時関数を使う理由JavaScriptから即時関数を排除するclosure(クロージャ)まずは見た目に慣れるところから始めたいと思います。2クロージャを理解するには、まずレキシカルスコープ(静的スコープ)とダイナミックスコープを理解する必要がありそうです。レキシカルスコープは関数を定義した時点でスコープが決まり、ダイナミックスコープは関数を実行した時点でスコープが決まるものです。どちらになるかは言語次第のようで、JavaScriptは前者です。1MDNの例で、何が特徴的なのかを確認します。他の言語に慣れている人は"関数内部のローカル変数はその関数が実行されている間だけ存在する"と考えることに慣れているかもしれません。makeFunc();の実行時点でローカル変数nameが消滅するように直感し、結果このコードは動かないと考えられます。JavaScriptでは、このコードが動きます。JavaScriptでは、displayName()の定義時点でスコープが決まり、nameにはMozillaが設定されるものと解釈します。クロージャでは、この時の環境への参照を保持しており、myFuncを実行した時に結果を返すことができます。Mozillaで、何に使うんだよ?という疑問に答えてくれる人がたくさんいます。https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures#Practical_closureshttps://stackoverflow.com/questions/2728278/what-is-a-practical-use-for-a-closure-in-javascript/39045098https://artgear.hatenablog.com/entry/20120115/1326635158http://dqn.sakusakutto.jp/2012/02/javascript_13.htmlクロージャ再考で、オブジェクトとクロージャは何が違うんだよ?という疑問に答えてくれる人も見つけました。(実質答えてないけど)https://www.ibm.com/developerworks/jp/opensource/library/itm-progevo3/index.htmlhttps://www.ibm.com/developerworks/jp/opensource/library/itm-progevo4/index.html?ca=drs-オブジェクトとクロージャに関する考察に関する参考資料をもう一つ。http://kmaebashi.com/programmer/devlang/object.htmlクロージャについては、様々な言語の成り立ちやコンピュータサイエンス的なことへの理解が試される気がします。個人的には、クロージャにしかできないことがまだ見つからないため、探求を続けたいと思います。定義の仕方が3つあります。{}コードを解析、コンパイルするタイミングで関数を登録するため、同一の<script>内で、定義する前に呼び出しのコードがあっても正しく処理される。functionName(1);この場合、関数は変数なので、呼び出しよりも先に定義する必要がある。再利用しない場合(高階関数の引数にする場合やコールバック関数等)に重宝する。Functionコンストラクタスコープの解釈が直感と一致しない上、セキュリティとパフォーマンスの問題もある。この方法で定義するメリットは基本的にないらしい。Object.prototype.constructorの戻り値として内部的に使われていたりもするため、(開発者が)使わないなら要らないじゃんってことにはならない。ES2015でアロー関数が導入されました。アロー関数は、関数式の短い代替構文で、2つの理由から導入されました。thisを束縛しない。