<html>
<body>
<script type="text/javascript">
var x;
var mycars = new Array();
mycars[10] = "Saab";
mycars[20] = "Volvo";
mycars[30] = "BMW";
for (x in mycars)
{
document.write(mycars[x] + "<br />");
}
</script>
</body>
</html>
<html>
<body>
<script type="text/javascript">
var x;
var mycars = new Array();
mycars[10] = "Saab";
mycars[20] = "Volvo";
mycars[30] = "BMW";
for (x in mycars)
{
document.write(mycars[x] + "<br />");
}
</script>
</body>
</html>
for in
循环会遍历对象中的每一个属性。
在你的例子中,x
变量将会遍历mycars
对象中的所有属性。
如果你添加mycars.expensive = "Porsche";
,它也会被遍历到。
需要注意的是,正如MDC所述,不应该使用for in
循环遍历普通数组:
虽然这可能是一种遍历数组的方法,但这是不好的。
for…in
语句遍历用户定义的属性以及数组元素,因此如果您修改了数组的非整数或非正属性(例如通过向其中添加"foo"
属性,甚至通过向Array.prototype
添加方法或属性),for…in
语句将返回您自定义的属性名称以及数字索引。此外,由于迭代顺序是任意的,因此遍历数组可能不按数字顺序访问元素。因此,当遍历数组时最好使用传统的for循环和数字索引。甚至可能会对完全使用for…in(至少不使用propertyIsEnumerable()或hasOwnProperty()检查)提出类似的论据,因为它还将迭代Object.prototype(虽然通常不鼓励这样做,但是在Array.prototype等情况下,用户可以有用地扩展它,其中没有由包含其他库的命名空间问题引起的影响,这些库可能不会在这些迭代上执行上述检查,而且他们知道这种扩展将对他们自己对诸如for…in之类的迭代器的使用产生什么影响)。
首先,您需要创建一个具有3个项目的对象(而不是数组)
var mycars = new Object();
mycars[10] = "Saab";
mycars[20] = "Volvo";
mycars[30] = "BMW";
其中10
,20
和30
是对象属性。
然后您想浏览对象,访问所有属性并显示与属性相关联的每个值。
这就是JavaScript构造 [ for
(variable in
object) expression ] 的用途:
variable将设置为对象的第一个属性,然后是第二个属性,最后是最后一个属性。试试
for (v in mycars) alert(v);
观察它的工作方式,还有这个。
for (v in mycars) alert("Property: "+v+", value: "+mycars[v]);
for..in
循环遍历 Array
。 - Phrogzfor ... in
的结构对右侧对象中的每一个元素进行迭代。在您的情况下,for
语句下面的块针对mycars
中的每一辆车执行一次。
for in
是一种埋下错误供后代发现的方式。正如已经大量指出的那样,如果应用于数组,则会循环遍历数组的所有元素、数组的长度以及附加到数组的任何其他数据。将其应用于普通对象更好,但仍应通过hasOwnProperty
过滤索引。
最好使用框架提供的函数,如jQuery的$.each
for in
循环可用于任何对象,但不应用于普通数组。 - SLaks