前置き
注意:この記事はとりあえず書いてみたかったので書いただけで、特に深い意味もなければ学ぶ事も特にないと思います。それでも良い方はどうぞ
コードを書いてみる
const a = {a:1,b:1};
a.a = a;
console.log(a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.b);
(このconsole.log内を書きたかったがために記事を書いてる)
コードの説明
これだけだとtwitterにでも投稿してろ、となるのでコードの説明。
一行目
a,bのキーを持つオブジェクトaを用意する。
この時、オブジェクトのaと、キーのaは全く別物なので注意
二行目
オブジェクトaのキーaに、オブジェクトaを代入する。
なお、a.aのようにドットでアクセスするのを__プロパティアクセサー__といい、オブジェクトのキーにアクセスする方法の一つ1。javascriptでこの記法を避けて通るのは不可能2なので記述方法自体は誰でも知っているはず。
ちなみに、javascriptは参照渡しのような動作3を行うため、a===a.aはtrueになる。
なので、a===a.a.aもtrueになり、無限に辿ることが出来るようになる。
三行目
無限にアクセスできるaを辿り、bを出力する。
もちろん最後のa.bは、単純にa.bを記述したのと同じなので、定義したb=1が出力される。
ただ、実際に無限に書くのは難しいものもあるので、ここでは20個で止めている。
終わりに
実際にこのような使い方をすることはまず無いとは思いますが、参照渡しの言語だとこういう事もできるよというお話でした。
-
もう一つは
a["a"]という方法。キーを_文字列_ で指定する必要がある。 ↩ -
document.getElementByIdという表記で既に使っているし。
元々int型の1が入っていたのにオブジェクト型のaを代入できるのは、javascriptに型の指定が無いから。
この代入により、オブジェクトaのキーaには、元々のオブジェクトa自体が入っている。 ↩ -
曖昧表現の理由:JavaScriptに参照渡し/値渡しなど存在しない ↩