- 結論、参照した時点でそのプロパティがイニシャライズされる
動的型宣言かつスクリプト言語という枠組みなので、定義外の参照にも寛容?
これの困る点は振る舞いとして例外に飛ばず、意図しないイニシャライズの検知が遅れること。
- 仮に下記の
obj.c
がSQLのバインド変数でTBL名とかカラム名を受け付けている場合、obj.c
に入ってくる値が担保できない(開発者は定義したつもりがないので)- 結果、Scriptも落ちない、SQLも発行されているけどシステムの振る舞いがおかしいという事象に発展
- これの発見フェーズが運用とかになるとしんどい、UTで正常系のケースを「クエリ実行の確認」とかにしてると余裕ですり抜けちゃう
var obj = {a:10, b:20}; //定義していないプロパティを参照 obj.c = 30; //obj.cが30でイニシャライズされる console.log(JSON.strigify(obj)); //{"a":10,"b":20,"c":30}