ホームページ > 記事 > ウェブフロントエンド > JavaScriptのさまざまなトラバーサル手法を詳しく解説、あなたの知らないブラックテクノロジーもある
サンプルの説明を容易にするために、既存の配列とjsonオブジェクトは次のとおりです
var demoArr = ['Javascript', 'Gulp', 'CSS3', 'Grunt', 'jQuery', 'angular']; var demoObj = { aaa: 'Javascript', bbb: 'Gulp', ccc: 'CSS3', ddd: 'Grunt', eee: 'jQuery', fff: 'angular' };
サンプルを直接見ることができます、多用されており、非常に簡単です
(function() { for(var i=0, len=demoArr.length; i<len; i++) { if (i == 2) { // return; // 函数执行被终止 // break; // 循环被终止 continue; // 循环被跳过 }; console.log('demo1Arr['+ i +']:' + demo1Arr[i]); } })();
forループについては、注意すべき点がいくつかあります
for ループ内の i は、ループ終了後もスコープ内に存在します。スコープ内の他の変数への影響を避けるために、関数の自己実行メソッドを使用してそれを分離します。 ();
for( var i=0; i
var i = 0, len = demo1Arr.length; for(; i<len; i++) {};
ループから抜け出す方法はいくつかあります
return 関数の実行が終了します
break ループが終了します
continue ループはスキップされます
完全な例
for(var item in arr|obj){} は配列とオブジェクトを走査するために使用できます
配列を走査するとき、 item は次のことを表しますインデックス値、arr は現在のインデックス値に対応する要素を表します arr[item]
オブジェクトをトラバースする場合、item はキー値を表し、arr はキー値に対応する値を表します 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 は関数の実行が終了することを示すことに注意する必要があります。ループ外のコードは実行を継続できなくなります。 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'); //不会执行 }
demoArr.forEach(function(arg) {})
パラメータargは配列内の各項目の要素を表します 例は以下の通りです
demoArr.forEach(function(e) { if (e == 'CSS3') { return; // 循环被跳过 // break; // 报错 // continue;// 报错 }; console.log(e); })
具体的には以下のようなものがあります。
forEachはトラバースできないことに注意してください オブジェクト
はIE、Firefox、Chromeでは使用できません このメソッドを実装してください
forEachはbreakを使用できず、returnを使用する場合はループから抜け出し続けます, 効果は for ループ内で continue を使用するのと同じです
関数の具体的な実装は以下の通りですが、注意すべき点は、 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<len); })();
$.each(demoArr|demoObj, function(e, ele))
配列とオブジェクトの走査に使用できます、 e はインデックス値またはキー値を表し、ele は値の値を表します
$.each(demoArr, function(e, ele) { console.log(e, ele); })
出力は
0 "Javascript" 1 "Gulp" 2 "CSS3" 3 "Grunt" 4 "jQuery" 5 "angular"
ここで注意すべき点がたくさんあります
ループをスキップして実行を続けるには、return または return true を使用します後続のループ
ループの実行を終了するには return false を使用しますが、関数の実行は終了しません
Break を使用してループをスキップし続けることはできません
この値の出力はループは次のようなものです
console.log(this); //String {0: "C", 1: "S", 2: "S", 3: "3", length: 4, [[PrimitiveValue]]: "CSS3"} console.log(this == ele); // true
上記のValueについて、トラバースしてください
$.each(this, function(e, ele) { console.log(e, ele); }) // 0 c // 1 s // 2 s // 4 3
lengthと[[PrimitiveValue]]がトラバースされないのはなぜですか?突然思いついて、その答えを「JavaScript 高度なプログラミング」で見つけました。おそらく JavaScript の内部プロパティで、$(this) のオブジェクト データ プロパティの Enumerable を false
// 查看length的内部属性 console.log(Object.getOwnPropertyDescriptor(this, 'length')); // Object {value: 4, writable: false, enumerable: false, configurable: false}
$.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: sequence を走査するために使用されます。 value ele: 現在のみ 走査された DOM 要素
this 現在走査されている DOM 要素は jQuery メソッドを呼び出すことができません
$(this) == $(ele) 現在走査されている要素の jquery オブジェクトは jQuery メソッドを呼び出すことができますdom 操作へのメソッド
domList は配列ではなくオブジェクトであるため、そのキー値が 0、1、2... であるという理由だけで、配列に似ているように感じますが、直接トラバーサルした結果は以下の通りです
var domList = document.getElementsByClassName('its'); for(var item in domList) { console.log(item, ':' + domList[item]); } // 0: <li></li> // 1: <li></li> // ... // length: 5 // item: function item() {} // namedItem: function namedItem() {}
だから、for inを使ってdomListをトラバースするときは、domListを配列に変換する必要があります
var res = [].slice.call(domList); for(var item in res) {}
もちろん、このようなオブジェクトには関数の属性引数オブジェクトもあります。文字列も走査できますが、文字列の他の属性の列挙可能値は false に設定されているため、走査の結果は配列と同じになるため、この問題を心配する必要はありません。
ちょっとした補足
+function(ROOT, Struct, undefined) { ... }(window, function() { function Person() {} })
()(), !function() {}() +function() {}() 三种函数自执行的方式^_^
以上就是JavaScript 各种遍历方式详解,有你不知道的黑科技的内容,更多相关内容请关注PHP中文网(www.php.cn)!