オブジェクトの凍結について
ObjectクラスのFreezeメッソドについて調査しました。
オブジェクトは1次元配列、2次元配列および連想配列を対象としました。
テスト手順は次の通りです
(1)オブジェクトの宣言
1次元配列、2次元配列および連想配列を内容を含めて宣言する。
宣言にはvar、letおよびconst宣言がありますが、どの宣言でも結果は同じでした。
(2)オブジェクトの凍結
宣言した各オブジェクトをFreezeメッソドにより凍結する。
(3)オブジェクト要素の変更/追加/削除
凍結された各オブジェクトに対して、要素の変更/追加/削除を行う。
結果は次の通りです。
(1)連想配列の時
①要素の変更:既存のキーの値の変更はできません。実行時エラーとはなりません。
②要素の追加:新しいキーと値の追加はできません。実行時エラーとはなりません。
③要素の削除:deleteメソッドによる削除はできません。実行時エラーとはなりません。
(2)1次元配列の時
①要素の変更:インデックス(ary[0])による変更はできません。実行時エラーとはなりません。
②要素の追加:pushメソッド(ary.push())による要素の追加はできません。実行時エラーとなります。
③要素の削除:popメソッド(ary.pop())による要素の削除はできません。実行時エラーとなります。
(3)2次元配列の時
①1次元要素の変更/追加/削除
・要素の変更:インデックス(ary[0])による変更はできません。実行時エラーとはなりません。
・要素の追加:pushメソッドによる要素の追加はできません。実行時エラーとなります。
・要素の削除:popメソッドによる要素の削除はできません。実行時エラーとなります。
②2次元要素の変更/追加/削除
・要素の変更:インデックス(ary[0][0])による変更はできます。
・要素の追加:pushメソッド(ary[0].push())による要素の追加はできます。
・要素の削除:popメソッド(ary[0].pop())による要素の削除はできます。
次に私の感想を述べます。
(1)連想配列の時
要素の変更/追加/削除ができないのは当然なのですが、実行時エラーとはなりません。
これは連想配列が引数で渡された関数においては、連想配列が凍結されているか/いないかによって
動きが異なるということです。
またソースコードを見ただけではどちらになるかが分からないということです。
(2)1次元配列の時
こちらは連想配列と違って、要素の追加/削除(push/popメソッド)の時は、実行時エラーとなります。
(3)2次元配列の時
①1次元要素の変更/追加/削除
こちらは1次元配列の時と同じです。
②2次元要素の変更/追加/削除
何と2次元要素に関しては、凍結しているにも関わらず何でもできてしまいます。
最後に質問というか、私の感じた疑問です。
(1)現状の仕様について
歴史的経緯や互換性のため現状の仕様になっていると思います。
その経緯や理由を知っている人がいれば、簡単で良いので教えていただきたいです。
(2)開発現場において
上記調査結果に見るといろいろ勘違いが発生しそうです。
実際の開発現場では上記結果は当然の事実として、問題にはならないのでしょうか。