ホームページ  >  記事  >  ウェブフロントエンド  >  JavaScript の for..in ループの落とし穴

JavaScript の for..in ループの落とし穴

高洛峰
高洛峰オリジナル
2016-11-28 13:33:391298ブラウズ

R JavaScript の for..in サイクル トラップ

JavaScript には 2 つの方法があることは誰もが知っています:

(1) for ループ

(2) for..in サイクル;配列オブジェクトを反復するための for ループは誰にとっても一般的なものでなければなりません。ただし、for..in ループを使用する場合は、誰もが注意する必要があります。なぜそう言えるのでしょうか。皆さん、私の話を聞いてください...

javascript は、オブジェクトのプロパティまたは配列の各要素、for.. のプロパティを反復するために使用される特別なループ (つまり、for..in ループ) を提供します。 in ループ内のループ カウンタは数値ではなく文字列です。これには、現在のプロパティの名前または現在の配列要素のインデックスが含まれます。

ケース 1:

               //使用for..in循环遍历对象属性
 
               varperson={
 
                       name: "Admin",
 
                       age: 21,
 
                       address:"shandong"
 
               };
 
              
 
               for(vari in person){
 
                       console.log(i);
 
               }

実行結果は次のとおりです:

名前

年齢

住所

オブジェクトの走査 When 、変数 i (ループ) counter、オブジェクトの属性名

               //使用for..in循环遍历数组
 
               vararray = ["admin","manager","db"]
 
               for(vari in array){
 
                       console.log(i);
 
               }

実行結果:

0

1

2

配列を走査するとき、変数 i はループ数は現在の配列要素のインデックス

ケース 2:

しかし、for.. in ループは非常に使いやすいようですが、すぐに満足しすぎないでください。次の例:

                 var array =["admin","manager","db"];
 
                 //给Array的原型添加一个name属性
 
                 Array.prototype.name= "zhangsan";
 
                 for(var i in array){
 
                    alert(array[i]);
 
                 }

実行結果:

admin

manager

db

zhangsan

すごいですね、なぜ突然チャンサンが現れたのでしょうか

さて、もう一度 for ループを使用すると何が起こるでしょうか?

               vararray = ["admin","manager","db"];
 
                //给Array的原型添加一个name属性
 
               Array.prototype.name = "zhangsan";
 
               for(var i =0 ; i<array.length; i++){
 
                      alert(array[i]);
               };

実行結果:

admin

manager

db

ああ、理解できました、for..inループは特定の型のプロトタイプにメソッドを配置しますプロパティが反復処理されるため、コード内で予期しないエラーが発生する可能性があります。この問題を回避するには、オブジェクトの hasOwnProperty() メソッドを使用します。オブジェクトのプロパティまたはメソッドが継承されていない場合、hasOwnProperty() メソッドは true を返します。つまり、ここでのチェックには他のオブジェクトから継承されたプロパティやメソッドは含まれず、特定のオブジェクト自体で直接作成されたプロパティのみが含まれます。

ケース 3:

               vararray = ["admin","manager","db"];
 
               Array.prototype.name= "zhangshan";
 
               for(vari in array){
 
                      //如果不是该对象自身直接创建的属性(也就是该属//性是原型中的属性),则跳过显示
 
                       if(!array.hasOwnProperty(i)){
 
                               continue;
 
                        }
 
                        alert(array[i]);
 
               }

実行結果:

admin

manager

db

また来ます 相変わらずいいですね、ねえ、わかりません、同志の皆さん、これを読んでどう思いますか?「雲を追い払って晴れた空を見た」という気持ちはありますか?
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。