前言
for in
我想並不陌生,因為在 Reflection 與 Extend 時有用它來遍歷物件並且印出來,然而前面我們也提到過,陣列也是物件,所以也可以在原型上加入新的屬性或方法,本篇是用來介紹關於兩者如果一起用可能會導致的問題。
直接看例子:
1 | var arr = ['John', 'Mary', 'Tom']; |
雖然很奇怪但這是合理的結果,因為陣列也是物件。
變數 item
中的 0、1、2 其實是名稱屬性,所以可以使用中括號取用它們,而 John、Mary、Tom
是值。我們使用 for in
遍歷了整個陣列並且印出。
接著我們增加屬性到它的原型上。
1 | Array.prototype.myNewAdd = 'cool!'; |
結果居然多跑出一行我們新增到原型上的屬性,為什麼?
因為陣列也是物件,而 for in
會找到原型鏈上,把原型上的屬性、方法一起遍歷,所以再一些不需要 for in
的情況中可以使用 for
迴圈即可,像是這樣:
1 | for(var i = 0; i < arr.length; i++){ |