for和for in區別

for ... in 循環中的代買每執行一次,就會對數組的元素或者對象的屬性進行一次循環操做。javascript

    eg:應該用在非數組對象的遍歷上,使用for-in進行循環也被稱爲「枚舉」。 html

 

for (變量 in 對象)
{
    在此執行代碼
}

「變量」用來指定變量,指定的變量能夠是數組元素,也能夠是對象的屬性。
var  data = {
      '4' : 'first' ,
      '3' : 'second' ,
      '2' : 'third' ,
      '1' : 'fourth'
  };
  for  ( var  i in  data) {
      console.log(i + "  "  + data[i])
  }

IE11, chrome31, firefox23的打印以下:java

1  fourth
2  third
3  second
4  first
var  obj = {
   "first" : "first" ,
    "zoo" : "zoo" ,
   "2" : "2" ,
   "34" : "34" ,
   "1" : "1" ,
   "second" : "second"
};
for  ( var  i in  obj) { console.log(i); };

IE11, chrome31, firefox23的打印以下:chrome

1
2
34
first
zoo
second

 
事實上,它不必定根據定義時的順數輸出,全部瀏覽器的最新版本如今都按chrome執行,先把當中的非負整數鍵提出來,排序好輸出,而後將剩下的定義時的順序輸出。因爲這個奇葩的設定,讓avalon的ms-with對象排序不按預期輸出了。只能強制用戶不要以純數字定義鍵名。數組

 

因此建議不要對數組執行for in循環,事實上,在高性能javascript這本書中,也強調了for in循環的很差,由於它老是會訪問該對象的原型,看下原型上是否有屬性,這在無心中就給遍歷增長了額外的壓力。瀏覽器

 

解決方法:
oop

若是某個對象具備給定名稱的屬性,那麼Object.prototype.hasOwnProperty(name)返回true。若是該對象是從原型鏈中繼承了該屬性,或者根本沒有這樣的一個屬性,則返回false。經過hasOwnProperty限定for in循環在當前中遍歷,而不用去考慮它的原型屬性。性能

function finalArray(){
var array=[1,2,3,4,5 ];
Array.prototype.age=13;
var result=[];
for(var i in array){
if(array.hasOwnProperty(i)){
result.push(array[i]);
}
}
alert(result.join(''));
}

注意事項:
spa

1.有一部分瀏覽器,例如早期的safari瀏覽器,不支持這個方法firefox

2.對象常常被用做哈希值,這就是存在hasOwnProperty被另外的屬性屏蔽的風險(可是我估計沒有人那麼無聊使用這個屬性)

文章來源:http://caibaojian.com/js-loop-for-in.html

相關文章
相關標籤/搜索