これは、「parent」という名前の「windowオブジェクト」というような捉え方で合っていますでしょうか?
はい、あってますよ
オブジェクトを変数に代入するときは「参照の値渡し」です。
なんのこっちゃサッパリ分からないと思うので解説していきます。
ChromeブラウザはWebサイトを開いた時に、
JavaScript世界のwindowオブジェクトを自動で用意してくれます。
windowオブジェクトの実体はメモリ空間上に保存してあり、グローバル変数windowにはメモリ空間のアドレス値が入っています。
var parent = window;
を行ったとき、
windowの「アドレス値」が宣言したparent変数にコピーされます。
ですのでparent.hogehogeという風にparentのプロパティを操作すると、windowオブジェクトのプロパティが釣られて変化します。
JavaScript
1var data1 = {name: "taro", score: 80};
2var data2 = data1;
3data2.name = "jiro";
4data2.score = 70;
5
6console.log(data1); // {name: "jiro", score: 70}
7console.log(data2); // {name: "jiro", score: 70}
windowオブジェクトは配列としても扱うことができるということでしょうか?
オブジェクトと配列は別物です。
単にオブジェクトのプロパティには2つのルールでアクセス出来るだけです。
オブジェクトの利用 - MDN
JavaScript
1var data = {name: "taro", score: 80};
2console.log(data.name); // taro
3console.log(data["score"]); // 80
JavaScript
1parent[names[i]] = parent[names[i]] || {};
2parent = parent[names[i]];
for文の中身のこれですね。
for文の前にvar parent = window;
とかやってますが、parentってのは親という意味ですよね。
windowはwindowだから親でもなんでもないやん?
parent[names[i]]
はオブジェクトのプロパティへのアクセスルールの一つでしたね。
オブジェクトに紐づくプロパティは親子関係の様にも見えます。
- parent: オブジェクトそのもの
- 子: オブジェクトのプロパティ
という擬似的な親子関係を想像して、parent変数を用意しているのです。
for文の1行目はparent[names[i]] || {}
をparent[names[i]]
に代入しています。
JavaScriptでは、A || B
を評価した場合、
まずAを単体でif文に放り込んでtrueになりそうなもの(1以上の数値や文字列、オブジェクトや配列などなど…)はAそのものが返って来ます。
もしAがfalseになりそうなものだったら、Bを返します。
JavaScript
1var data = {name: "taro", score: 80};
2
3// data.nameは常に存在するので"taro"が返ってくる
4console.log(data.name); // taro
5console.log(data.name || "nanashi"); // taro
6
7// data.ageは用意していないので18になる
8console.log(data.age); // undefined
9console.log(data.age || 18); // 18
or演算子||
の右辺は{}
ですね。
空のオブジェクトを作ってparentのプロパティに代入しています。
続いて変数の代入の続きです。
for文の二行目のparent = parent[names[i]]
って何をやってるんでしょうか?
えええ、parent = window
してたよね?windowオブジェクトぶっ壊れるじゃんどうしてくれんの!?!?
そうではありません。
オブジェクトを代入した変数に、別の値を代入した場合、オブジェクトのアドレス値参照が切り離されます。
百聞は一見に如かず、いつものdata変数でどうなるか試してみましょう。
JavaScript
1var data = {name: "taro", score: 80};
2var data2 = data;
3data2.child = {name: "jiro", score: 0};
4
5// data2はdataのアドレス値を捨てて、data.childのアドレス値に切り替わる
6data2 = data2.child;
7data2.score = 70;
8
9console.log(data); // {name: "taro", score: 80, child: {name: "jiro", score: 70}}
10console.log(data2); // {name: "jiro", score: 70}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/09/15 05:44
2018/09/15 15:58
2018/09/16 06:05