Skip to content

WeakMap の例について #627

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
1 task
yuanji-dev opened this issue Jan 6, 2019 · 3 comments
Closed
1 task

WeakMap の例について #627

yuanji-dev opened this issue Jan 6, 2019 · 3 comments
Assignees
Labels
Status: Ready for PR Pull RequestしてOKな状態 Type: Enhancement

Comments

@yuanji-dev
Copy link
Contributor

該当ページ

質問内容

WeakMap について1つ目の例はなかなかわかりにくいと思います(一応初心者の私にとっては)。

// eventTargetの参照が変われば自動的にイベントリスナーが解放される
eventTarget = null;

この二行のコードの說得力はちょっと弱いと思います。eventTargetnull にして後一体どんなことがあったのかもっと具体的に説明すればいいと思います。

ちょっとネットの上で調べると、この例 ruanyf/es6tutorial#362 (comment) を見つけた(heapUsed の値が変わった)。よりわかりやすいではと思いますので、此処に貼ります。

@azu
Copy link
Collaborator

azu commented Jan 7, 2019

WeakMap 1番目の例から少し具体的すぎるのが、わかりにくさの原因なようにも見えますね
もっと基本的なMapとWeakMapでの動作の違い(自動的に開放されない例)を出せるとよさそうですね。
(eventTargetは2番目の例にする感じで)

const obj = { key: {} };
const map = new WeakMap();
map.set(obj.key, 1);
console.log(map.get(obj.key));
delete obj.key; // ここで obj.key が消された = どこからも参照されなくなった(WeakMapはweakな参照なので例外的) = JavaScriptエンジンはGCで解放してよくなった => WeakMapで参照してた場合は参照できなくなって undefinedになる というのを説明する
console.log(map.get(obj.key));

JavaScriptにgc関数はないので、gc関数なしで観測しやすい例があるとわかりやすくなるような気がします。

関連:

@yuanji-dev
Copy link
Contributor Author

わかりますけど

delete obj.key;
console.log(map.get(obj.key));

この例も問題があると思います。 obj.key は既に delete されちゃったので、当然 obj.key を再びアクセスするときには undefined になちゃう。なので、 console.log(map.get(obj.key)) => console.log(map.get(undefined)) になる。 WeakMap にかかわらず、最初から const map = new Map() にするのも同じ結果を得るのではないかと思います。

gc関数なしで観測しやすい例を提出するのはなかなか難しいよね。

@lacolaco
Copy link
Collaborator

lacolaco commented Feb 9, 2019

#654 で修正しました

@lacolaco lacolaco closed this as completed Feb 9, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Status: Ready for PR Pull RequestしてOKな状態 Type: Enhancement
Projects
None yet
Development

No branches or pull requests

3 participants