「パーフェクトJavaScript」メモ 5章 変数とオブジェクト

編集モードをはてな記法にした。

変数にオブジェクトを代入すると、変数にオブジェクトの参照が代入される

原文ママ。一見日本語がおかしいようだが意味はわかる。参照渡しなので以下のような動きをする。

>var a = { x:1, y:2 };
>var b = a;
>b.x++;
>print(b.x);
2
>print(a.x);
2

a か b に新しいオブジェクト値が渡されない限り彼らは同じものを見続ける。bののぞき穴からオブジェクトの値を変更した後も、同じものを見続けている彼らからは同じものが見える。

var one = 1;
var zero = 0;
function swap(a,b){
  return [b, a];
}

しかしこれ全然わからない。これでなぜ one と zero の値が入れ替わるのか
引数と関係があるのかreturnと関係があるのか。関数の項を見ればわかりそうだけど。

jsの変数はプロパティそのもの

まじか

関数から抜けた後もアクセス可能なローカル変数がある
クロージャとして後ほど説明がある

よろしくお願いします

undefined値に対してプロパティアクセスするとTypeError
単に存在しないプロパティを呼ぶだけだとundefinedが返ってくるだけ

これはよく思い知らされる

オブジェクト指向の説明はいろいろなプログラミング関連書籍に出てくるけど、どれも自分がエアマスターを人に薦めるときのような語り口になってる。
すなわち、言いよどみながらも以下の内容を含んだ文章を述べる。
「宗教や思想のようなものである」
「説明は抽象的にならざるをえない」
「いろいろとアレであるが」
「いいものである」
「よさを一言で表すのは難しいが」
「いいものである」

引数をオブジェクトリテラルで渡すのは以下の点で優れている
・名前付きで渡せる引数の順番を間違えにくい
・引数()部分の記述が短くて済む

いいですね

「コンストラクタ代わりの関数での利用法」の項、全然わからない。まずコンストラクタがよくわかっていないので。
と思ったらすぐ後にコンストラクタとnew式の説明があった。
しかし、これも全然さっぱりわからない。どうした。
これは「コンストラクタという概念が入っていないとコンストラクタの説明を読んでもコンストラクタがわかるようにならない」という一見矛盾めいた真理の現前なのではないか。
おそらくArrayとか使ったことなければArrayの項を読んでも意味がわからないだろうが自分はわかった、それがコンストラクタでは効かなかったのだ。

コンストラクタについてわかったこと
・コンストラクタは 常にnew式で呼び出す
・コンストラクタは常に、同時に関数である。すなわち関数の一種である。コンストラクタとして意図した関数を「コンストラクタ」と呼んでいる
・コンストラクタ内には return文をかかないようにしましょう

コンストラクタについてわからないこと
・どういうとき使うのか
・なぜ使うのか
・なんなのか

以上。とりあえず先に進む。

数値をキーに値をひけるデータ構造を一般に配列と呼ぶ

そこが配列のキモだったのか。「順番がある」かと思ってた(同じこと?)。

この定義でいくと連想配列は配列ではないということになるな。

で、連想配列はハッシュと呼ばれることもあるしマップや辞書と呼ぶこともあるが、この本では連想配列と呼ぶらしいです。

オブジェクトを連想配列として見る・使うことが可能なだけで、連想配列用の何かが用意されているわけではない

この辺の説明は自分に自然に受け入れられた

プロトタイプ継承もわからないので、こののち説明が出てくるようなのでそのときまで理解をおあずけ。
うお、と思ったがすぐここからプロトタイプチェーン、プロトタイプオブジェクトと話が続くのか。
本書で初めて数ページにわたりつまずいたぞ
「Aを使いたいとか、Aとは何なのか知りたいとかいった欲望を持たない人に対して『Aとは何か』を説明しても理解できない」と一般化できるか。

いつまでも素人でいたい(都合のよい名ゼリフを思いついたので言う)

ここでここから先7ページほどの記述を読み飛ばすのは得策か否か。
結論→字面だけ読んでみよう。

どうやらコンストラクタやクラスといった、プログラミングにおける初歩的な道具に対して理解がないと厳しそうだ。
クラスがまだいまいちのようだ。他の言語を少しでもやっているとここで足踏みしないかもしれないな。

能書きが長くなってしまったな。

p137,138の見開きで最初に「光が差した」かなと思った一文がこちら

プロトタイプチェーンによりすべてのオブジェクトは最終的にObject.prototypeオブジェクトへの暗黙リンクを持ちます。

これはなんとなく世界の想像をしやすくしそうな文。

で、あまりにわからないので以下のコードをブラウザのコンソールに書く。

>function MyClass(){ this.x = 'aaaa'; }  
>var obj = new MyClass();
>obj 

結果は
f:id:stand-ooc:20160927235606p:plain
あー、newで変数に関数を代入すると、明示的に作ったオブジェクトの他にプロトタイプもくっつきますよということですかね。

あとは使いどころがわかればパッと道が開ける気がしました。先に進もう。

__proto__は暗黙リンク先のオブジェクトを参照しています
__proto__プロパティは、ECMAScriptの仕様にはない実装依存の存在です

そうだったのか

なんとかプロトタイプの項を抜けた。

var d = new Date();

もしかしてこれコンストラクタでした?(もしかしてもなにも、そうか。)

「5-17 オブジェクトと型」の項、オブジェクトの型判定の話から始まっているが「オブジェクトにとって型とは何か」「どういうものが考えられるか」が全然書いてないので自明なんだろうな(しかし、全然イメージできていない)。

というわけでググった
qiita.com
ArrayとかFunctionとかJSONとかDateとかErrorが型と呼ばれるものに該当するようだ。
上の記事での型判定の記述、パーフェクトJavaScriptの記述に共通しているところが多々あるので安心する。世界はつながっていた

for in 文もfor each in 文もin演算もプロトタイプチェーンをたどります

そうなのか。困ったことはないが。意図してないのに辿られたら困るんじゃあないのか(今日ジョジョ見た)

「5-17-5 プロパティの列挙(プロトタイプ継承を考慮)」を見ると、p130のプロパティの属性の説明でenumberable属性の意味を「for in 文で列挙可能」と書いてあるのは本質的な説明ではないようだ。 例えば、keysで拾えるかどうかにも関わる。

アクセッサ属性

この章のこの記述だけではちょっと何もわからない。ゲッターとセッターは非常によく使うしぜひ仕組みを理解しておきたいところだが

「5-19 標準オブジェクト」ArrayクラスやDateクラスといったオブジェクトの型の列挙、してくれてました。ありがとうございます。

Object.prototypeオブジェクトにプロパティを追加すると、あらゆるものにプロパティが追加される

笑った。仏教のよう

Object.prototypeオブジェクトのプロパティの列挙、とてもありがたい。今までただの(邪魔な)文字の羅列であった。そこに意味が与えられる。光差す。
しかし今は流し読みさせていただきます

「◯◯は宗教である」「これは宗教論争である」といった文の意味って明確なのだろうか。解釈に幅がありそう。
しかし、数ある解釈を包含した意味をこれらの文が持っているとすれば、問題ないような感じもする。(完全な脱線)

唐突にMathオブジェクトとErrorオブジェクトの説明が(グローバルオブジェクトの説明の後に)あるが、このふたつが特殊なのか、なぜここで特にとりあげられたのかが不明だ。それが明らかになるのはいつの日か、乞うご期待

5章終了。