JavaScriptにおけるfor-inエルゴード方式の例を紹介します.
1171 ワード
要旨:for-inエルゴード方式の循環カウンタは文字列タイプで、オブジェクトを遍歴する時は対象属性/方法名で、配列を遍歴する時は配列要素の下付き索引で、普通のfor循環と違って、for-innは継承する属性/方法を列記します.この点は使用時に特に注意が必要です.
従来のforサイクルを除いて、JavaScriptは巡回操作のためにfor-in方式を定義しています.データソースによって、使用時に違いがあります.
(1)オブジェクトを巡回:
(2)配列を巡回
コードに追加すると:
この場合はforで循環して出力すると、0,1になります.つまり、for-i-nは現在動作しているデータソースの属するタイプが持つ属性を遍歴しています(同様にオブジェクトfishにfor-iを使うと、cloneも出力されます)ので、for-in遍歴時に一本の弦を引く必要があります.オブジェクトに固有の属性操作だけであれば、継承された属性を削除する必要があります.
従来のforサイクルを除いて、JavaScriptは巡回操作のためにfor-in方式を定義しています.データソースによって、使用時に違いがあります.
(1)オブジェクトを巡回:
var fish = {
head : 1,
tail : 1,
}
for(var prop in fish) {
console.log(fish[prop]);
}
デバッグ時の観察:propは順次「head」、「tail」となります.つまり、オブジェクト属性を巡回した時に文字列タイプで存在し、循環カウンタを対象とした属性名です.(2)配列を巡回
var arr = ['one', 'two', 'three'];
for(var prop in arr) {
console.log(prop);
}
デバッグ時の観察:propは順に'0'、'1'で、つまりアレーを巡回する時それとも文字列のタイプで存在しますか?違いは循環カウンタが配列要素の下付きです.(この場合、for循環出力を試してみてもいいです.結果はfor-i-nと一致します.)コードに追加すると:
if(Object.prototype.clone === 'undefined')
Object.prototype.clone = function() {};
出力結果は、0,1,cloneです.この場合はforで循環して出力すると、0,1になります.つまり、for-i-nは現在動作しているデータソースの属するタイプが持つ属性を遍歴しています(同様にオブジェクトfishにfor-iを使うと、cloneも出力されます)ので、for-in遍歴時に一本の弦を引く必要があります.オブジェクトに固有の属性操作だけであれば、継承された属性を削除する必要があります.