for和for in區別


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

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

 

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的打印如下:

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的打印如下:

1
2
34
first
zoo
second

 
事實上,它不一定根據定義時的順數輸出,所有瀏覽器的最新版本現在都按chrome執行,先把當中的非負整數鍵提出來,排序好輸出,然后將剩下的定義時的順序輸出。由於這個奇葩的設定,讓avalon的ms-with對象排序不按預期輸出了。只能強制用戶不要以純數字定義鍵名。

 

所以建議不要對數組執行for in循環,事實上,在高性能javascript這本書中,也強調了for in循環的不好,因為它總是會訪問該對象的原型,看下原型上是否有屬性,這在無意中就給遍歷增加了額外的壓力。

 

解決方法:

如果某個對象具有給定名稱的屬性,那么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(''));
}

注意事項:

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

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


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


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



a = '1' 與 a = 1的區別 $(this)和this的區別 即和既的區別 is 和 as的區別 ‘1’==1和‘1’===1的區別 in和or的區別 as 和 with的區別 與(&,&&)和或(|,||)的區別 this和 $(this)的區別 for … of和for … in的區別
 
粤ICP备14056181号  © 2014-2021 ITdaan.com