2 回答

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超3個(gè)贊
foreach是取一個(gè)對(duì)象上的所有屬性,而非遍歷數(shù)組,例如如下代碼:
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實(shí)際遍歷的是一個(gè)NodeList對(duì)象而非純數(shù)組,此對(duì)象上有一個(gè)item方法和一個(gè)length屬性(由W3C DOM Spec - Interface NodeList定義),在代碼循環(huán)中追加log可以看出:
var?Ele?=?document.getElementsByTagName("iframe");for?(var?i?in?Ele)?{????console.log(i?+?"="?+?Ele[i]); }
輸出應(yīng)該是類似:0=xxx,1=xxx...length=?,item=function() {...},后面兩個(gè)一個(gè)是int一個(gè)是function,src屬性自然為空
最后建議遍歷數(shù)組還是盡量用for,foreach有風(fēng)險(xiǎn)

TA貢獻(xiàn)1863條經(jīng)驗(yàn) 獲得超2個(gè)贊
首先兩次undefined的根本原因在于用for in遍歷時(shí),遍歷到了兩個(gè)不存在src屬性的屬性。
舉個(gè)例子:
<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 是一個(gè)NodeList 對(duì)象,也是一個(gè)偽數(shù)組。即本質(zhì)上是對(duì)象但也有數(shù)組的一些特性,比如有l(wèi)ength屬性,可以用索引遍歷但沒(méi)有數(shù)組的push,shift等函數(shù)。
而 NodeList 對(duì)象有兩個(gè)屬性:length
:返回節(jié)點(diǎn)列表中的節(jié)點(diǎn)數(shù)目item()
:返回節(jié)點(diǎn)列表中處于指定的索引號(hào)的節(jié)點(diǎn)。
for in遍歷時(shí)遍歷到了length,item()方法,因?yàn)闆](méi)有上面的src屬性,因此返回undefined。
而for(var i=0,len=divs.length;i<len;i++)遍歷只遍歷了前面length個(gè)屬性。
最后,不要用for in來(lái)遍歷數(shù)組,除非有意為之。
添加回答
舉報(bào)