本文详细对比了JavaScript中for...in与for...each...in两种遍历语句的区别。重点分析了for...each...in作为E4X标准在低版本IE浏览器中的兼容性问题,以及两者在获取属性名与属性值时的行为差异。建议遍历数组时使用原生for循环,遍历对象时优先选用兼容性更好的for...in。
for...in与for...each...in的基本区别
区别一:
for...in语句最早发布于JavaScript 1.0版本。相比之下,for...each...in是作为E4X标准的一部分在JavaScript 1.6中引入的,它并不属于ECMAScript标准规范。这种标准归属上的差异导致了广泛的浏览器兼容性问题,许多浏览器并不支持for...each...in,例如IE6、IE7和IE8等均无法支持该语法。
区别二:
遍历行为与变量值差异
示例代码定义了一个名为长方形(ChangFangXing)的对象,包含高和宽两个属性:var 长方形= { 高:"15", 宽:"25" };
for (var i in 长方形){
alert( i + "," + 长方形[i] );
}
使用for...in遍历该对象时,结果依次输出:属性名“高”与值“15”,接着是属性名“宽”与值“25”。
for each (var i in 长方形){
alert( i + "," + 长方形[i] );
}
使用for...each...in遍历该对象时,结果依次输出:属性值“15”与undefined,接着是属性值“25”与undefined。
两种遍历方法中变量i的值含义不同。for...each...in无法获取对象的属性名,只能获取到属性值;而for...in可以获取属性名。
实际使用建议
最后总结一下使用建议:
(1)遍历普通数组时,建议使用原生的for循环,不要贪图方便。因为for...in和for...each...in均存在浏览器兼容性问题,且不能保证对数组的遍历顺序(如果对顺序不作要求,可以使用for...in,但本人不建议)。有兴趣的话,可以阅读下一篇文章《关于js中for in的缺陷浅析》。
(2)遍历对象时,由于原生for循环无法提供理想的遍历方式,因此只能选择其他方法。这里建议使用for...in。从上述讲解的区别来看,for...in比for...each...in更具优势,因为for...in能获取索引(属性名)和属性值,而for...each...in只能获取属性值,而且for...each...in在很多低版本的浏览器中是不支持的。
以上所述就是本文的全部内容了,希望大家能够喜欢