js中for-innの坑

3284 ワード

var arr=[1,2,3]
1.伝統forサイクル
//    
for(var i=0;i
//     return     
function a(){
  for(var i=0;i
標準的なforサイクルの中でiはnumberタイプです.break、continue文が使えます.
//    
var obj={name:'cc',aa:10};
var keys=Object.keys(obj);//                          ["name", "aa"]
for(var i=0;i
短所:このような書き方は面倒くさいし、相手を遍歴するのに不便です.
2.for in
for(var i in arr){}
for in
  • for inというサイクルiはstringタイプの
  • です.
  • が配列に作用するfor-i-n循環体は配列要素を巡回するだけでなく、自身のエニュメレート・属性
  • も存在する.
  • オブジェクトのプロトタイプに方法を加えると、for inというサイクルは配列プロトタイプチェーン上の属性をすべてアクセスすることができます.
  • は、場合によっては、このコードは、ランダムな順序で配列要素を巡回することができる.
  • は、つまり、for-innは通常のオブジェクトのために設計されており、文字列タイプのキーを遍歴することができますので、配列遍歴には適用されません.
  • //    
    Array.prototype.test=function(){}
    arr.name='jq'
    for(var i in arr){
      console.log(typeof i);//"string"
      console.log(i);//"0","1","2","name","test"
      console.log(arr[i]);//1,2,3,jq,ƒ (){} 
    }
    
    //  json
    Object.prototype.aa=function(){}
    var json={'name':111}
    for(var i in json){
      console.log(i);//"name","aa"
     console.log(json[i]);//111,ƒ (){}
    }
    
    for inを使用すると発生する可能性のあるエラーが発生します.1.もしある日、Js原生のAray類を拡張するために、外部のjsフレームを導入しても、元のArayを拡張します.問題はすぐ来ます.この提案は2時2分であり、無意識のうちに文字列演算を行う可能性があります.例えば、「2」+1=「21」は符号化過程に大きな不便をもたらします.
    3.forEachサイクル
    forEach法は配列の各要素に対して一回に提供される関数を実行することで、s 5操作配列の一つの方法である.
    arr.aa=12;
    arr.forEach(function(item,index,arr){
       console.log(item);//1,2,3
    })
    
    //  return      
    arr.forEach(function(item,index,arr){
       return;
       console.log(item);//1,2,3
    })
    
    //     return       
    function a(){
      arr.forEach(function(item){
         console.log(item);
         return 7;
       })
    }
    a()
    
    //  break,continue    
    var arr=[1,2,3,4];
    arr.forEach(function(item,index,arr){
       break;
       //continue;
       console.log(item);
    })
    // VM3387:2 Uncaught SyntaxError: Illegal break statement
    //  Illegal continue statement: no surrounding iteration statement
    
    短所:途中でforEachサイクルから出られません.continue、break命令またはreturn命令は効果がありません.
    ES 6 for-ofサイクル
    for...ofはキーの値を遍歴することを許可します.
    for…of循環内部で呼び出したのはデータ構造のSymbol.iterator方法です.
    arr.foo='hello'
    for (let a of arr) {
      console.log(a); //1,2,3
    }
    
    
    //for...of   return    
    for(let i of arr){
    console.log(i);
    return;
    }
    //  :Illegal return statement
    
    //break     
    for(let i of arr){
    console.log(i);//1
    break;
    }
    
    //continue       
    for(let i of arr){
      if(i==1){continue;}
      console.log(i);//2,3
    }
    
    //    return     
    function a(){
      for(let i of arr){
         console.log(i);
          return;
       }
    }
    a();//1
    
      :
    
     -    for...in       ,            ,  for...in    。
     -     forEach  ,    break、continue return    。
     -                   。
     - for...of             、Set   Map   、         (  arguments  、DOM NodeList   )、    Generator   ,     。