javascriptで思ったこと

動機

最近javascriptを書き始めた。
他の言語との違いとか、注意点とか個人的に気になったことを備忘録としてまとめておく。

他の言語との違い

SQLJavaphpとやって感じた違いとか特徴は

  1. 動的型付け
  2. 手続き型
  3. オブジェクト指向(プロトタイプ)
  4. 関数が第一級の扱い
  5. 変数のスコープ
  6. シングルスレッド

といったところ。一つ一つ考えてみる。

動的型付け

phpの様に型付けは動的に行われる。なので変数の宣言の際に型名を指定する必要はない。静的解析の恩恵が受けやすい静的型付けのほうが個人的には好み。
数学でも割としっかり証明書く人は静的付けのほうが好きそうという勝手な偏見。

手続き型

言うことは特になし。

オブジェクト指向(プロトタイプ)

クラスがあってそこからインスタンスが作られるのではなく元になるインスタンスがあってそれをコピーして新しいインスタンスを得る。オブジェクトの量と種類が少量多種みたいな状況だと書き易いのかな?

関数が第一級

よく使うのは関数を変数に代入する機能。なので関数を引数にする関数が出来たりする。数学的に言えばは双対空間とか汎関数みたいな感じ。便利。
関数の処理の中でちょっとだけ変えたい部分について引数として関数を渡してそれを起動したり出来る。
代入をクロージャで記述して変数の評価を遅らせたりできるみたい。

変数のスコープ

ブロックスコープがない。グローバルか関数内ローカルかだけ。クロージャと合わせ技でよく間違いが起きそう。というか俺は起きた。

シングルスレッド

本質的にシングルスレッドらしい。内部の機構は、

  • 処理するタスクをキューに登録される
  • その時のキューの先頭のタスク処理する
  • タスクは関数単位である

という感じらしい。タスクを途中で止めての割り込みとかはできないみたい。なので中々終わらない処理を書くと何も反応しなくなる。
これを知っておかないと、一定時間毎に処理を行うsetInterval関数とか一定時間後に処理を行うsetTimeoutの挙動の理解を誤りそう。