for(var i in object){処理・・・}
なんてのは、よく目にしますが・・・。
for(var i = ['あ', 'い', 'う']; i[0]; i.shift()){ alert(i[0]); }
これでも。i に配列を代入して、i[0] が false を返すようなものではない間、shift で i に代入された配列を削っていきます。ということで、この場合は、あ、い、う、と表示される。
当然。もっと自由に考えれば。
var o = {
v : 2,
fn : function (){this.v = this.v * 2},
en : function (){
if(this.v < 10) return true;
alert(this.v);
}
};
for(; o.en(); o.fn()){}
なんてのも。v : 2,
fn : function (){this.v = this.v * 2},
en : function (){
if(this.v < 10) return true;
alert(this.v);
}
};
for(; o.en(); o.fn()){}
わざわざこんな処理に冗長な例ですが・・・。for 内の処理や条件を外部で、作成・変更できたりと、結構自由に使えます。ただ。やり過ぎると、深刻な混乱を招いたりするので、誰が見ても分かりやすい物にした方が無難かも。
私は遊びで使ったりします。ひょっとしたら嫌う人もいるかもしれない。
この記事へのコメント
たとえば、inの対象となるオブジェクトに組み込み意外のprototypeが設定されていた場合、プロトタイプチェーンを辿ってしまうので、ループ変数に余計なものが含まれてしまいます。
万全を期するために、普通は
for(var item in obj){
if(hasOwnProperty(item)){
//目的の処理
}
}
とします。
うーん。for の変わった使い方ということでちょっと趣旨違うかも。
おっしゃっているのは in を使う場合の動作の問題ですね。
in を使う場合、ご指摘の懸念は「どんな目的で in を使うか」の1ケースに過ぎません。
場合によっては hasOwnProperty 以外も取得したい場合がある事を考慮すると hasOwnProperty が必ず必要という訳ではありません。
ま、大抵意図してないのでデフォでも良いかも知れませんが。
ちょっと訂正すると、頂いたコードでは obj. が抜けてると・・・。