0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

プロパティアクセスで無限にアクセスしてみる

Posted at

前置き

注意:この記事はとりあえず書いてみたかったので書いただけで、特に深い意味もなければ学ぶ事も特にないと思います。それでも良い方はどうぞ

コードを書いてみる

a.js
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個で止めている。

終わりに

実際にこのような使い方をすることはまず無いとは思いますが、参照渡しの言語だとこういう事もできるよというお話でした。

  1. もう一つはa["a"]という方法。キーを_文字列_ で指定する必要がある。

  2. document.getElementByIdという表記で既に使っているし。
    元々int型の1が入っていたのにオブジェクト型のaを代入できるのは、javascriptに型の指定が無いから。
    この代入により、オブジェクトaのキーaには、元々のオブジェクトa自体が入っている。

  3. 曖昧表現の理由:JavaScriptに参照渡し/値渡しなど存在しない

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?