JS配列とオブジェクトの遍歴
6226 ワード
例の説明を容易にするために,既存の配列とjsonオブジェクトは以下の通りである.
for
例を直接見ることができて、使いすぎて、簡単です.
forループについて、いくつか注意が必要です forサイクル中のiは、サイクル終了後に任意に作用ドメインに存在し、作用ドメイン中の他の変数に影響を及ぼすことを避けるために、関数自己実行方式を用いてそれを分離する() for(var i=0;iの方式を用いることを避ける.このような配列長は毎回計算され、効率は上記の方式より低い.変数宣言をforの前に置いて実行することもでき、読解性 を向上させることができる.
ループから飛び出す方法は次のようなものがあります. return関数実行終了 breakサイクルが終了する continueサイクルは をスキップされる
完全なインスタンス(https://github.com/yangbo5207/front-end-road/blob/master/16.%E5%90%84%E7%A7%8D%E9%81%8D%E5%8E%86%E8%AF%A6%E8%A7%A3/demo1.html)
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はループを終了するだけで、後のコードは実行されます.
forEach
demoArr.forEach(function(arg){})パラメータargは配列の各項目の要素を表し、例は以下の通りである.
具体的には以下の注意点がありますコールバック関数には2つのパラメータがあり、それぞれ値とインデックスを表す.この点はjQueryの$と同じである.each逆 forEachオブジェクトを巡回できません forEachはIEで使用できず、firefoxとchromeはこの方法 を実現した. forEachはbreakを使用できず、continueはループから飛び出し、returnを使用すると、効果はforループでcontinueを使用することと一致する の最も重要な点は、2番目のパラメータを1つの配列に追加することができ、コールバック関数のthisがこの配列を指します.2番目のパラメータがない場合、thisはwindowを指します.
原生ではforEachループの限界が多いが、彼の必要性を理解するには、多くのサードパーティライブラリが彼のメソッドを拡張し、angularのツールメソッドのような多くの場所に適用できるようにすることである.例えばangularのツールメソッドにもforEachメソッドがあり、その使用は原生とほとんど変わらないが、限界がなく、IEの下で使用することができ、対象を遍歴することができる.
do/while
関数の具体的な実装方法は以下の通りですが、continueを使用する場合、i++を後ろに置くと、i++の値はずっと変わらず、最後にデッドサイクルに陥ることに注意してください.だからdo/whileを使うには慎重にしなければなりません.
do/whileを使用して配列を巡回することは推奨されません
$.each
出力は
0 "Javascript"1 "Gulp"2 "CSS3"3 "Grunt"4 "jQuery"5 "angular"
ここには注意すべき点がたくさんあります. returnまたはreturn trueを使用して、1回のループをスキップするために、後続のループ を実行し続ける. return falseを使用してループの実行を終了するが、関数実行 を終了することはない. breakとcontinueを使用してループ をスキップすることはできません.サイクルにおけるthis値出力は、以下のように である.
上のthis値について、遍歴してみます
//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の遍歴に特化 i:シーケンス値ele:現在巡回中のDOM要素 のみ this現在遍歴されているDOM要素は、jQueryメソッド を呼び出すことができません.$(this)=$(ele)現在要素を巡るjqueryオブジェクトは、dom操作 のためにjqueryメソッドを呼び出すことができる.
for inを使用してDOMListを巡回する
domListは配列ではなくオブジェクトであるため、key値が0,1,2...で配列に似ていると感じますが、直接遍歴した結果は次のようになります.
そこで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
例を直接見ることができて、使いすぎて、簡単です.
(function() { for(var i=0, len=demoArr.length; i
forループについて、いくつか注意が必要です
var i = 0, len = demo1Arr.length; for(; i
ループから飛び出す方法は次のようなものがあります.
完全なインスタンス(https://github.com/yangbo5207/front-end-road/blob/master/16.%E5%90%84%E7%A7%8D%E9%81%8D%E5%8E%86%E8%AF%A6%E8%A7%A3/demo1.html)
for in
for(var item in arr|obj){}配列とオブジェクトの遍歴に使用できます
(function(){for(var i in demoArr){if(i==2){return;//関数実行が終了//break;//ループが終了//continue;//ループがスキップされる};console.log("demoArr[i]:"+ demoArr[i]); } console.log("-------------"); })();
for inについては、以下の点に注意してください.
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(val, index) { if (e == 'CSS3') { return; // // break; // // continue;// }; console.log(val, index); })
具体的には以下の注意点があります
var newArr = []; demoArr.forEach(function(val, index) { this.push(val); // this newArr }, newArr)
原生ではforEachループの限界が多いが、彼の必要性を理解するには、多くのサードパーティライブラリが彼のメソッドを拡張し、angularのツールメソッドのような多くの場所に適用できるようにすることである.例えばangularのツールメソッドにもforEachメソッドがあり、その使用は原生とほとんど変わらないが、限界がなく、IEの下で使用することができ、対象を遍歴することができる.
var result = []; angular.forEach(demoArr, function(val, index) { this.push(val); }, result);
do/while
関数の具体的な実装方法は以下の通りですが、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"
ここには注意すべき点がたくさんあります.
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'); }; })
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つの関数が自己実行される方法_