1. ホーム
  2. javascript

[解決済み] フリーズとシールの違い

2022-04-15 01:06:44

質問

JavaScriptのメソッドについて聞いたのですが freezeseal これは、任意のオブジェクトをイミュータブルにするために使用することができます。

ここでは、その使い方の簡単な例を紹介します。

var o1 = {}, o2 = {};
Object.freeze(o2);

o1["a"] = "worked";
o2["a"] = "worked";

alert(o1["a"]);   //prints "worked"
alert(o2["a"]);   //prints "undefined"

とはどのような違いがあるのでしょうか? freezeseal ? パフォーマンスを向上させることができるのでしょうか?

どのように解決するのですか?

Object.seal

  • シールされたオブジェクトにプロパティを追加したり削除したりするのを防ぐことができます。 delete は false を返します。
  • これは、既存のすべてのプロパティを 設定不可 データディスクリプタからアクセッサディスクリプタに変換することはできず、アクセッサディスクリプタの属性を変更することはできません。 writable 属性、および value 属性は、もし writeable が真)。
  • を投げることができます。 TypeError シールされたオブジェクトの値を変更しようとしたとき (最も一般的なのは ストリクトモード )

Object.freeze

  • まさに何 Object.seal が行う、プラス。
  • を変更することを防ぎます。 任意の 既存のプロパティ

どちらも 'deep'/grandchildren オブジェクトには影響しません。例えば、もし obj が凍結されている場合。 obj.el の値は再割り当てできませんが obj.el は、例えば以下のように変更することができます。 obj.el.id を変更することができます。


パフォーマンス

ブラウザによっては、オブジェクトのシーリングやフリーズが列挙の速度に影響を与えることがあります。

  • Firefox:列挙のパフォーマンスには影響なし
  • IE:列挙のパフォーマンスへの影響はごくわずかです
  • Chrome: シールされたオブジェクトやフリーズしたオブジェクトでは、列挙のパフォーマンスが速くなる
  • Safari:封印または凍結されたオブジェクトの列挙が92%遅くなる(2014年現在)

テスト 封印されたオブジェクト , 凍結品 .