2 回答

TA貢獻1828條經驗 獲得超3個贊
foreach是取一個對象上的所有屬性,而非遍歷數組,例如如下代碼:
var?prop,?obj?=?{?a:?"a",?b:?"b"?}; obj[0]?=?"c";for?(prop?in?obj)?{ ????console.log(prop?+?"="?+?obj[prop]); }
輸出是類似:0=c, a=a, b=b
樓主的foreach實際遍歷的是一個NodeList對象而非純數組,此對象上有一個item方法和一個length屬性(由W3C DOM Spec - Interface NodeList定義),在代碼循環中追加log可以看出:
var?Ele?=?document.getElementsByTagName("iframe");for?(var?i?in?Ele)?{????console.log(i?+?"="?+?Ele[i]); }
輸出應該是類似:0=xxx,1=xxx...length=?,item=function() {...},后面兩個一個是int一個是function,src屬性自然為空
最后建議遍歷數組還是盡量用for,foreach有風險

TA貢獻1863條經驗 獲得超2個贊
首先兩次undefined的根本原因在于用for in遍歷時,遍歷到了兩個不存在src屬性的屬性。
舉個例子:
<div class="div1"></div> <div class="div2"></div>
var divs = document.getElementsByTagName('div');
console.dir(divs)我們可以得到:
NodeList[2] 0: HTMLDivElement 1: HTMLDivElement length: 2 __proto__: NodeList constructor: function NodeList() { [native code] } item: function item() { [native code] } __proto__: Object
上面的 divs 是一個NodeList 對象,也是一個偽數組。即本質上是對象但也有數組的一些特性,比如有length屬性,可以用索引遍歷但沒有數組的push,shift等函數。
而 NodeList 對象有兩個屬性:length
:返回節點列表中的節點數目item()
:返回節點列表中處于指定的索引號的節點。
for in遍歷時遍歷到了length,item()方法,因為沒有上面的src屬性,因此返回undefined。
而for(var i=0,len=divs.length;i<len;i++)遍歷只遍歷了前面length個屬性。
最后,不要用for in來遍歷數組,除非有意為之。
添加回答
舉報