for in 列舉陣列(Array)的危險陷阱

Javascript for in 列舉陣列(Array)的危險陷阱:

一般而言,我們使用for來重複操作陣列,使用for in 來列舉物件屬性。

但for in 也不是不能操作陣列,只是這種作法有陷阱存在。

原因出在於對物件屬性的擴充,這會造成for in在操作陣列時,將擴充屬性也當成陣列內容列舉出來。

讓我們看看下面的例子。

for in 列舉陣列(Array)的範例:

<script type="text/javascript">
 var arr=["one","two","three"];
  for ( a in arr){
 document.writeln("arr["+a+"]="+arr[a]+"<br/>");
}
 arr.four="four";
 Array.prototype.five="five";
 document.writeln("=====================<br/>");
 for ( a in arr){
 document.writeln("arr["+a+"]="+arr[a]+"<br/>");
}
</script>

for in 列舉陣列(Array)的範例輸出:

arr[0]=one
arr[1]=two
arr[2]=three
=====================
arr[0]=one
arr[1]=two
arr[2]=three
arr[four]=four
arr[five]=five

很明顯陣列arr新增屬性four與原型新增屬性five都被當成陣列元素列舉出來了。

這種邏輯錯誤在真正寫程式時,可能不容易發現。

就算是自己確定沒有對物件新增屬性,但在合作開發的程式下,

誰能確定陣列原型沒有被動過...

所以說,用for in 操作陣列是危險的行為,

對內建物件的原型進行擴充,也是不好的習慣。當然對ECMAScript未來支援的擴充實作除外。

參考:迴圈敘述 for 與 for in陣列物件 Array

 
 

  按個讚!~支持本站!~

FB推薦載入中  

你可能會有興趣的文章