JavaScriptでは様々なループを利用して巡る方法をまとめています
6044 ワード
例の説明を容易にするために,既存の配列とjsonオブジェクトは以下の通りである.
for in
for(var item in arr|obj){}配列とオブジェクトの遍歴に使用できます
配列を巡回する場合、itemはインデックス値、arrは現在のインデックス値に対応する要素arr[item]がオブジェクトを巡回する場合、itemはkey値、arrはkey値に対応するvalue値obj[item]を表す
for inについては、以下の点に注意してください.
forループとfor inループでは、i値はループが終了した後に保持されます.したがって、関数の自己実行を使用することは避けられます.return,break,continueを用いてループを飛び出してもforループと一致するが,returnについては関数体ではreturnが関数実行終了を表し,ループ外のコードであっても下に実行しないことに注意する必要がある.breakはループを終了するだけで、後のコードは実行されます.
パラメータargは配列の各項目の要素を表し、例は以下の通りである.
具体的には以下の注意点があります forEachオブジェクトを巡回できません forEachはIEで使用できず、firefoxとchromeはこの方法 を実現した. forEachはbreakを使用できず、continueはループから飛び出し、returnを使用すると、効果はforループでcontinueを使用することと一致する do/while
関数の具体的な実装方法は以下の通りですが、continueを使用する場合、i++を後ろに置くと、i++の値はずっと変わらず、最後にデッドサイクルに陥ることに注意してください.だからdo/whileを使うには慎重にしなければなりません.
do/whileを使用して配列を巡回することは推奨されません
$.each
配列とオブジェクトを巡回するために使用できます.eはインデックス値またはkey値を表し、eleはvalue値を表します.
出力は
ここには注意すべき点がたくさんあります. returnまたはreturn trueを使用して、1回のループをスキップするために、後続のループ を実行し続ける. return falseを使用してループの実行を終了するが、関数実行 を終了することはない. breakとcontinueを使用してループ をスキップすることはできません.
サイクル中のthis値出力は次のようになります.
上のthis値について、遍歴してみます
なぜlengthと[[primitiveValue]]は遍歴しなかったのですか?突然、「javascript高度プログラミング」で答えが見つかりました.javascriptの内部属性で、オブジェクトデータ属性のEnumerableをfalseに設定するという意味です.
$(selecter).each
DOMListの遍歴に特化
i:シーケンス値ele:現在遍歴されているDOM要素thisが現在遍歴されているDOM要素のみ、jQueryメソッド$(this)=$(ele)現在遍歴されている要素のjqueryオブジェクトを呼び出すことはできません.jqueryのメソッドを呼び出してdom操作を行うにはfor inを使用してDOMListを遍歴することができます.
domListは配列ではなくオブジェクトであるため、key値が0,1,2...で配列に似ていると感じますが、直接遍歴した結果は次のようになります.
//1:
// ...
//length: 5
//item: function item() {}
//namedItem: function namedItem() {}
そこでforinを用いてdomListを巡回する場合,domListを配列に変換する必要がある.
このようなオブジェクトには関数の属性argumentsオブジェクトもあり、もちろん文字列も遍歴可能であるが、文字列の他の属性のenumerableがfalseに設定されているため、遍歴の結果は配列と同じであり、この問題を心配する必要はない.マイナー補完
もし誰かが関数を書いているのを見つけたら、慌てないでください.彼が背が高くて鳥が立たないとは思わないでください.
()(), !function(){}()+function(){}()の3つの関数を自己実行する方法^^;
var demoArr = ['Javascript', 'Gulp', 'CSS3', 'Grunt', 'jQuery', 'angular'];
var demoObj = {
aaa: 'Javascript',
bbb: 'Gulp',
ccc: 'CSS3',
ddd: 'Grunt',
eee: 'jQuery',
fff: 'angular'
};
for in
for(var item in arr|obj){}配列とオブジェクトの遍歴に使用できます
配列を巡回する場合、itemはインデックス値、arrは現在のインデックス値に対応する要素arr[item]がオブジェクトを巡回する場合、itemはkey値、arrはkey値に対応するvalue値obj[item]を表す
(function() {
for(var i in demoArr) {
if (i == 2) {
return; //
// break; //
// continue; //
};
console.log('demoArr['+ i +']:' + demoArr[i]);
}
console.log('-------------');
})();
for inについては、以下の点に注意してください.
forループとfor inループでは、i値はループが終了した後に保持されます.したがって、関数の自己実行を使用することは避けられます.return,break,continueを用いてループを飛び出してもforループと一致するが,returnについては関数体ではreturnが関数実行終了を表し,ループ外のコードであっても下に実行しないことに注意する必要がある.breakはループを終了するだけで、後のコードは実行されます.
function res() {
var demoArr = ['Javascript', 'Gulp', 'CSS3', 'Grunt', 'jQuery', 'angular'];
for(var item in demoArr) {
if (item == 2) {
return;
};
console.log(item, demoArr[item]);
}
console.log('desc', 'function res'); //
}
forEach
demoArr.forEach(function(arg) {})
パラメータargは配列の各項目の要素を表し、例は以下の通りである.
demoArr.forEach(function(e) {
if (e == 'CSS3') {
return; //
// break; //
// continue;//
};
console.log(e);
})
具体的には以下の注意点があります
関数の具体的な実装方法は以下の通りですが、continueを使用する場合、i++を後ろに置くと、i++の値はずっと変わらず、最後にデッドサイクルに陥ることに注意してください.だからdo/whileを使うには慎重にしなければなりません.
do/whileを使用して配列を巡回することは推奨されません
// while
(function() {
var i = 0,
len = demoArr.length;
while(i < len) {
if (i == 2) {
// return; //
// break; //
// continue; // , ,i , , !!
};
console.log('demoArr['+ i +']:' + demoArr[i]);
i ++;
}
console.log('------------------------');
})();
// do while
(function() {
var i = 0,
len = demo3Arr.length;
do {
if (i == 2) {
break; //
};
console.log('demo2Arr['+ i +']:' + demo3Arr[i]);
i++;
} while(i
$.each
$.each(demoArr|demoObj, function(e, ele))
配列とオブジェクトを巡回するために使用できます.eはインデックス値またはkey値を表し、eleはvalue値を表します.
$.each(demoArr, function(e, ele) {
console.log(e, ele);
})
出力は
0 "Javascript"
1 "Gulp"
2 "CSS3"
3 "Grunt"
4 "jQuery"
5 "angular"
ここには注意すべき点がたくさんあります.
サイクル中のthis値出力は次のようになります.
console.log(this);
//String {0: "C", 1: "S", 2: "S", 3: "3", length: 4, [[PrimitiveValue]]: "CSS3"}
console.log(this == ele);
// true
上のthis値について、遍歴してみます
$.each(this, function(e, ele) {
console.log(e, ele);
})
// 0 c
// 1 s
// 2 s
// 4 3
なぜlengthと[[primitiveValue]]は遍歴しなかったのですか?突然、「javascript高度プログラミング」で答えが見つかりました.javascriptの内部属性で、オブジェクトデータ属性のEnumerableをfalseに設定するという意味です.
// length
console.log(Object.getOwnPropertyDescriptor(this, 'length'));
// Object {value: 4, writable: false, enumerable: false, configurable: false}
$.each $(this) this , ,
$(selecter).each
DOMListの遍歴に特化
$('.list li').each(function(i, ele) {
console.log(i, ele);
// console.log(this == ele); // true
$(this).html(i);
if ($(this).attr('data-item') == 'do') {
$(this).html('data-item: do');
};
})
i:シーケンス値ele:現在遍歴されているDOM要素thisが現在遍歴されているDOM要素のみ、jQueryメソッド$(this)=$(ele)現在遍歴されている要素のjqueryオブジェクトを呼び出すことはできません.jqueryのメソッドを呼び出してdom操作を行うにはfor inを使用してDOMListを遍歴することができます.
domListは配列ではなくオブジェクトであるため、key値が0,1,2...で配列に似ていると感じますが、直接遍歴した結果は次のようになります.
var domList = document.getElementsByClassName('its');
for(var item in domList) {
console.log(item, ':' + domList[item]);
}
// 0:
//1:
// ...
//length: 5
//item: function item() {}
//namedItem: function namedItem() {}
そこでforinを用いてdomListを巡回する場合,domListを配列に変換する必要がある.
var res = [].slice.call(domList);
for(var item in res) {}
このようなオブジェクトには関数の属性argumentsオブジェクトもあり、もちろん文字列も遍歴可能であるが、文字列の他の属性のenumerableがfalseに設定されているため、遍歴の結果は配列と同じであり、この問題を心配する必要はない.マイナー補完
もし誰かが関数を書いているのを見つけたら、慌てないでください.彼が背が高くて鳥が立たないとは思わないでください.
+function(ROOT, Struct, undefined) {
...
}(window, function() {
function Person() {}
})
()(), !function(){}()+function(){}()の3つの関数を自己実行する方法^^;