web-dev-qa-db-ja.com

ES2015のWeakMapにプリミティブキーがないのはなぜですか?

JavaScriptには6つのプリミティブデータタイプがあります。

Boolean, Number, String, Symbol, undefined, null

WeakMap は、プリミティブデータタイプをキーとして持つことはできません。そして WeakSet はプリミティブ値を持つことはできません。

どうしてこれなの?言語設計の決定(この場合、何が原因でしたか)ですか、それともプリミティブを弱く保存できない根本的な理由がありますか?おそらく後者だと思いますが、理由はわかりません。

6
callum

言語の実装では、プリミティブ型を参照型ではなく型として使用する可能性が高いためです。つまり、ソース式で使用されているのと同じオブジェクトへの参照がaに含まれるように変数を変更するのではなく、新しい変数に値を割り当てると、そのオブジェクトの値が変数にコピーされる場合があります(C#がわかっている場合) 、structclass)の違いについて考えてください。そのため、ガベージコレクションの対象となるオブジェクトがなく(コピーされる値のみ)、弱いキーの削除がトリガーされないため、このような値を弱い参照ストレージシステムの一部として使用することはできません。

これらの一般的なデータ型の参照ではなく値の使用は、パフォーマンスを大幅に改善できる最適化であるため、ECMAscriptの開発者は、使用できないことを意味する機能を追加しないように注意していたでしょう。

このようなアイテムを使用する必要がある場合は、コンテナーオブジェクト(通常は「ボックス」と呼ばれます)を作成して値を保持し、参照のみが許可されているコンテキストで使用できるようにします。

4
Jules