前置き
注意:この記事はとりあえず書いてみたかったので書いただけで、特に深い意味もなければ学ぶ事も特にないと思います。それでも良い方はどうぞ
コードを書いてみる
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に参照渡し/値渡しなど存在しない ↩