0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ObjectクラスのFreezeメッソドについて

Posted at

オブジェクトの凍結について

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)開発現場において
  上記調査結果に見るといろいろ勘違いが発生しそうです。
  実際の開発現場では上記結果は当然の事実として、問題にはならないのでしょうか。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?