JavaScriptの生きてるundefinedと死んでるundefined

JavaScriptの悪魔的な振る舞いの一つにundefinedがあると思う。

(最後のはobj['a']のタイポです。)

どういうことかというと、こう

var obj = {};
obj.a; //=> undefined
for(var i in obj) {
  console.log('iterate'); //こない
}
obj.a; //=> undefined
obj.a = undefined;
for(var i in obj) {
  console.log('iterate'); //くる
}

obj.a; //=> undefined
delete obj.a; //消した
for(var i in obj) {
  console.log('iterate'); //こない
}

ちなみに javascriptのundefinedはなぜか予約語じゃないので代入できる。nullはできない。

> null = 3
ReferenceError: Invalid left-hand side in assignment
> undefined = 3
3

ただsetterが定義されてないので実体が書き換わることはない。