JavaScript中for..in循環陷阱

JavaScript中for..in循環陷阱



大家都知道在JavaScript中提供了兩種方式迭代對象:

  (1)for 循環;

  (2)for..in循環;

使用for循環進行迭代數組對象,想必大家都已經司空見慣了。但是,使用for.. in循環時,大家可要注意了,爲什麼這麼說呢?大家聽我娓娓道來....

javascript提供了一種特殊的循環(也就是for .. in循環),用來迭代對象的屬性或數組的每個元素,for...in循環中的循環計數器是字符串,而不是數字。它包含當前屬性的名稱或當前數組元素的索引。

案例一:

               //使用for..in循環遍歷對象屬性

               varperson={

                       name: "Admin",

                       age: 21,

                       address:"shandong"

               };

              

               for(vari in person){

                       console.log(i);

               }


執行結果爲:

name

age

address

當遍歷一個對象的時候,變量 i 也就是循環計數器 爲 對象的屬性名

               //使用for..in循環遍歷數組

               vararray = ["admin","manager","db"]

               for(vari in array){

                       console.log(i);

               }


執行結果:

0

1

2

當遍歷一個數組的時候,變量 i 也就是循環計數器 爲 當前數組元素的索引

 

案例二:

但是,現在看來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

咦,奇觀了,怎麼平白無故的冒出來一個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循環會把某個類型的原型(prototype)中方法與屬性給遍歷出來,所以這可能會導致代碼中出現意外的錯誤。爲了避免這個問題,我們可以使用對象的hasOwnProperty()方法來避免這個問題,如果對象的屬性或方法是非繼承的,那麼hasOwnProperty() 方法返回true。即這裏的檢查不涉及從其他對象繼承的屬性和方法,只會檢查在特定對象自身中直接創建的屬性。

案例三:

               vararray = ["admin","manager","db"];

               Array.prototype.name= "zhangshan";

               for(vari in array){

                      //如果不是該對象自身直接創建的屬性(也就是該屬//性是原型中的屬性),則跳過顯示

                       if(!array.hasOwnProperty(i)){

                               continue;

                        }

                        alert(array[i]);

               }


運行結果:

admin

manager

db

一切又完好如初,哎,不知道,同志們看完有什麼感受,是不是有種“撥開雲霧見晴天”的感覺啊,呵呵

發佈了23 篇原創文章 · 獲贊 1 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章