JavaScriptに入門し始めたからまとめていくわ[part2]
went-went-takkun135.hatenablog.com
上記の続きです!
基本仕様後半戦!
ここからが難しいところなのでしょうね。 気合をいれて臨みたいと思います。 まじで早くNode.jsまでたどり着きたい!
変数とオブジェクト
代入
- 基本型のリテラルは値を代入
- それ以外のオブジェクトは参照を代入
だけとりあえず覚えておけば良さそう! バイト先でオブジェクトの値コピー方法を何回もググってる気がするけど、 未だにどれが正解かわかっていない。
オブジェクト
めちゃくちゃ長くて、 ちょっと難しすぎたから割と読み飛ばしてしまった。 おそらく著者が言いたかったことのエッセンスは
- 基本型以外のものは全てオブジェクト
- オブジェクトそれ自体には名前がなく、 名前がある変数などに参照を代入することで固有の名前を得る
- オブジェクトは内部にプロパティを持ち、 アクセスはドットかブラケット
- 連想配列としての使い方もある
- this参照には注意が必要
- 実質のクラスとしても使用可能
- クラスの継承みたいなのはプロトタイプ継承というものによって行われる
- 型判定やプロパティの列挙は汎用性が高すぎるせいで多少面倒
大変だった5章
この章めちゃくちゃ長くて力入れてるのがひしひしと伝わってきたものの、 めちゃくちゃ意味不でめちゃくちゃ眠かった(2,3回じゃないほどの寝落ち)。 しかし頑張っていきたいと思います。。
関数とクロージャ
スコープ
- ブロックスコープがJavaScriptにはない。
- JS独自拡張の変数宣言にletがありそれはブロックスコープがある
- 後は基本Pythonと同じ
クロージャ
言葉遣いは難解だったけど、 過去最高にわかりやすかった気がする。
function() {
var cnt = 0;
return function() { return ++cnt; }
}
var fn = f();
fn(); // 1
fn(); // 2
fn(); // 3
上記コードのように関数呼び出し時に関数を返すようにすると、 関数呼び出し時に生成されるCallオブジェクトなるものが 消去できなくなるため、ずっと同様のCallオブジェクトで この関数オブジェクトが呼び出されることとなり、 関数内の情報が保存されるという仕組みらしい。
モジュールがない
モジュールっぽい概念が言語仕様上はないらしいです。 一つのプロジェクトのグローバル変数が共有されるので、 大事故につながる恐れがあります。 そのため、一つのファイルをクラスのように括ってしまうなどの 対策が迫られるらしいのですが、それでもprivateな変数は作れません。 そこでクロージャ!みたいな感じの話でした。
データ処理
についての記載があった。
配列に関してはものすごく詳しく書かれていたが、
実用上はそれほど細かい知識は必要なさそうなので割と目を通した程度。
JSONはeval関数を使わないこと。
Date関数はクライアントサイドで使うと面倒なことと、
実行環境に依存すること。
正規表現はリテラル表現が存在し、
var reg = /^\s+/; // 先頭文字が空白
var reg = new RegExp('^\\s+');
のように記述する。他にもStringオブジェクト側から、 引数に正規表現を用いる技法も存在するが、 ここの難点は主に正規表現そのものなので、 JavaScript側で難しいことはそれほどないと思う。
まとめ
これでJavaScript基本仕様については終了! らしいがこれで実際にコードちゃんと読めるかは微妙なラインな気がする。 理由としては、 コード規約自体は簡単なのに、変なイディオムとか メソッドチェーンとかコールバック関数とか見慣れない使い方が多い みたいな感じやと思う。
つまり、結論
慣れが大事。