JavaScriptでは様々なループを利用して巡る方法をまとめています

6044 ワード

例の説明を容易にするために,既存の配列とjsonオブジェクトは以下の通りである.

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);
})

具体的には以下の注意点があります
  • forEachオブジェクトを巡回できません
  • forEachはIEで使用できず、firefoxとchromeはこの方法
  • を実現した.
  • forEachはbreakを使用できず、continueはループから飛び出し、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('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"
    

    ここには注意すべき点がたくさんあります.
  • returnまたはreturn trueを使用して、1回のループをスキップするために、後続のループ
  • を実行し続ける.
  • return falseを使用してループの実行を終了するが、関数実行
  • を終了することはない.
  • breakとcontinueを使用してループ
  • をスキップすることはできません.
    サイクル中の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つの関数を自己実行する方法^^;