亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

求指點,為什么注釋里運行的結果會多alert兩次undefined?

求指點,為什么注釋里運行的結果會多alert兩次undefined?

慕標5832272 2023-04-16 14:10:36
var Ele = document.getElementsByTagName("iframe");/*  for(var i in Ele){ alert(Ele[i].src); }  */ for(var i=0;i<Ele.length;i++){ alert(Ele[i].src); }
查看完整描述

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有風險


查看完整回答
反對 回復 2023-04-19
?
小唯快跑啊

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來遍歷數組,除非有意為之。


查看完整回答
反對 回復 2023-04-19
  • 2 回答
  • 0 關注
  • 110 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號