for/inでオブジェクトのプロパティ名を配列にコピー

オブジェクトのプロパティを走査するのにfor(variable in object)文がある。

var o={x:"New",y:"Year"};
var s="";
for(var p in o) s+=o[p];

variableは代入式の左側として適切なものであればどんな式でも記述できる。
つまり、ループの実行ごとに違う変数に代入させることも可能。
以下の場合、配列aには"x","y"の文字列が格納される。

var o={x:"New",y:"Year"};
var a=[];
var i=0;
for(a[i++] in o); // 空ステートメント

これで何が嬉しいかと言えば、例えばオブジェクトのプロパティ数を調べることができる。
Object.lengthがないので、配列化されたらArray.lengthが可能。


仮にObject.lengthがしたくて、prototypeで拡張してみるが...

Object.prototype.length = function (){
  var a=[];
  var i=0;
  for(a[i++] in this);
  return a.length;
}
var o={x:"New",y:"Year"};
o.length(); // 3

期待通りにはならない。
Object.prototypeで定義されたプロパティ(メソッド)はfor/inにて列挙されてしまうため、変数aには"x","y","length"という3つの値が格納されている。

http://itpro.nikkeibp.co.jp/article/COLUMN/20070626/275986/?ST=develop&P=3
Object.prototypeの拡張は「オブジェクト汚染」