JavaScriptのさまざまなトラバーサル手法を詳しく解説、あなたの知らないブラックテクノロジーもある

黄舟
リリース: 2017-02-24 13:32:06
オリジナル
1541 人が閲覧しました

サンプルの説明を容易にするために、既存の配列とjsonオブジェクトは次のとおりです

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<len; i++) {
        if (i == 2) {
            // return;   // 函数执行被终止
            // break;    // 循环被终止
            continue; // 循环被跳过
        };
        console.log(&#39;demo1Arr[&#39;+ i +&#39;]:&#39; + demo1Arr[i]);
    }
})();
ログイン後にコピー

forループについては、注意すべき点がいくつかあります

  • for ループ内の i は、ループ終了後もスコープ内に存在します。スコープ内の他の変数への影響を避けるために、関数の自己実行メソッドを使用してそれを分離します。 ();

  • for( var i=0; i

var i = 0, len = demo1Arr.length;
for(; i<len; i++) {};
ログイン後にコピー
  • ループから抜け出す方法はいくつかあります

    • return 関数の実行が終了します

    • break ループが終了します

    • continue ループはスキップされます

完全な例

for in

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(&#39;demoArr[&#39;+ i +&#39;]:&#39; + demoArr[i]);
    }
    console.log(&#39;-------------&#39;);
})();
ログイン後にコピー

for in については、次のような注意点があります:

  • for ループと for in ループでは、ループ終了後も i の値が保持されます。したがって、これを回避するには、自己実行関数を使用してください。

  • return、break、および continue を使用してループから抜け出すことは for ループと一致しますが、関数本体では return は関数の実行が終了することを示すことに注意する必要があります。ループ外のコードは実行を継続できなくなります。 Break はループを終了するだけであり、後続のコードは引き続き実行されます。

function res() {
    var demoArr = [&#39;Javascript&#39;, &#39;Gulp&#39;, &#39;CSS3&#39;, &#39;Grunt&#39;, &#39;jQuery&#39;, &#39;angular&#39;];

    for(var item in demoArr) {
        if (item == 2) {
            return;
        };
        console.log(item, demoArr[item]);
    }
    console.log(&#39;desc&#39;, &#39;function res&#39;); //不会执行
}
ログイン後にコピー

forEach

demoArr.forEach(function(arg) {})

パラメータargは配列内の各項目の要素を表します 例は以下の通りです

demoArr.forEach(function(e) {
    if (e == &#39;CSS3&#39;) {
        return;  // 循环被跳过
        // break;   // 报错
        // continue;// 报错
    };
    console.log(e);
})
ログイン後にコピー

具体的には以下のようなものがあります。

  • forEachはトラバースできないことに注意してください オブジェクト

  • はIE、Firefox、Chromeでは使用できません このメソッドを実装してください

  • forEachはbreakを使用できず、returnを使用する場合はループから抜け出し続けます, 効果は for ループ内で continue を使用するのと同じです

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(&#39;demoArr[&#39;+ i +&#39;]:&#39; + demoArr[i]);
        i ++;
    }
    console.log(&#39;------------------------&#39;);
})();

// do while
(function() {
    var i = 0,
        len = demo3Arr.length;
    do {
        if (i == 2) {
            break; // 循环被终止
        };
        console.log(&#39;demo2Arr[&#39;+ i +&#39;]:&#39; + demo3Arr[i]);
        i++;
    } while(i<len);
})();
ログイン後にコピー

$.each

$.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, &#39;length&#39;));
// Object {value: 4, writable: false, enumerable: false, configurable: false}
ログイン後にコピー

$.each に設定するということです。とこれは異なりますが、走査結果は同じです

$(selector).each

特に DOMList

$(&#39;.list li&#39;).each(function(i, ele) {
    console.log(i, ele);
    // console.log(this == ele); // true
    $(this).html(i);
    if ($(this).attr(&#39;data-item&#39;) == &#39;do&#39;) {
        $(this).html(&#39;data-item: do&#39;);
    };
})
ログイン後にコピー
  • i: sequence を走査するために使用されます。 value ele: 現在のみ 走査された DOM 要素

  • this 現在走査されている DOM 要素は jQuery メソッドを呼び出すことができません

  • $(this) == $(ele) 現在走査されている要素の jquery オブジェクトは jQuery メソッドを呼び出すことができますdom 操作へのメソッド

DOMList をトラバースするには in を使用します

domList は配列ではなくオブジェクトであるため、そのキー値が 0、1、2... であるという理由だけで、配列に似ているように感じますが、直接トラバーサルした結果は以下の通りです

var domList = document.getElementsByClassName(&#39;its&#39;);
for(var item in domList) {
    console.log(item, &#39;:&#39; + 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)!


ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート