32

JavaScript (および関連) に再参入する前に、私は多くの ActionScript 3 を実行しました。ただし、AS3 バージョンは通常のジェネリック オブジェクトのように列挙可能でしたが、WeakMap には特に.keys()orがありません.values()

AS3 バージョンでは、いくつかの非常に興味深く便利な構造をリグすることができましたが、JS バージョンは多少制限されているように感じます。何故ですか?

Flash VM がそれを実行できるとしたら、ブラウザーが同じことを実行できない理由は何ですか? それがどのように「非決定論的」になるかを読みましたが、それは一種のポイントですよね?

4

2 に答える 2

19

最後に本当の答えを見つけました: http://tc39wiki.calculist.org/es6/weak-map/

Weak Maps の重要な特性は、キーを列挙できないことです。これは、弱くマッピングされたオブジェクトを共有する環境内の他のシステムの内部動作を攻撃者が監視するのを防ぐために必要です。コレクション内のアイテムの数または名前が API から検出可能である必要があり、値がそうでなくても、WeakMap インスタンスは、以前は使用できなかったサイド チャネルを作成する可能性があります。

于 2014-07-14T01:30:16.847 に答える
0

それはトレードオフです。列挙可能性をサポートするオブジェクト <-> オブジェクト辞書を導入する場合、ガベージ コレクションに関して次の 2 つのオプションがあります。

  1. キー エントリは、キーとして使用されているオブジェクトのガベージ コレクションを防止する強力な参照と考えてください。

  2. 他のすべての参照がなくなったときにキーをガベージ コレクションできるように、弱い参照にします。

#1を実行すると、大きなオブジェクトがいたるところにメモリにリークすることで、非常に簡単に自分自身を撃つことができます。一方、オプション 2 を使用すると、キー ディクショナリがアプリケーションのガベージ コレクションの状態に依存するようになり、必然的にバグを追跡できなくなります。

于 2014-06-29T19:42:06.660 に答える