Javascript for()循环w /对象声明和IN保留字 - 只是寻找一些澄清

时间:2011-08-28 16:35:01

标签: javascript json object for-loop

我正在制作一个基本的学习脚本。我的主要问题是for()声明什么是'IN'保留字以及starName如何与它相关,因为它没有在页面的任何地方定义。

我试图了解for()循环是如何用“ starName in star 语句”思考“。

<script type="text/javascript">
var star = {};

star["Polaris"] = new Object;
star["Mizar"] = new Object;
star["Aldebaran"] = new Object;
star["Rigel"] = new Object;

star["Polaris"].constellation = "Ursa Minor";
star["Mizar"].constellation = "Ursa Major";
star["Aldebaran"].constellation = "Taurus";
star["Rigel"].constellation = "Orion";

</script>
</head>
<body id="mainbody">

<script type="text/javascript">
for (starName in star) {
var para = document.createElement('p');
para.id = starName;
para.appendChild(document.createTextNode(starName +
": " + star[starName].constellation));
document.getElementsByTagName("body")[0].appendChild(para);
}
</script>

<!-- output below -->

<p id="Polaris">Polaris: Ursa Minor</p>
<p id="Mizar">Mizar: Ursa Major</p>
<p id="Aldebaran">Aldebaran: Taurus</p>
<p id="Rigel">Rigel: Orion</p>

4 个答案:

答案 0 :(得分:3)

for ... in语法枚举对象的所有可枚举属性。

starName将是一个表示属性名称的字符串。您可以访问该属性(并执行许多其他操作):

var p = star[starName];

现在,在使用for ... in语法时,您应该注意以下几点:

利用hasOwnProperty来防止在原型链中添加更高级别的属性。

Object.prototype.allObjectWillInheritThis = 1;

/// ...

for (var starName in star) {
    if (star.hasOwnProperty(starName)) {

        // Do your thing
    }
}

过滤掉功能。您可能对功能感兴趣但对属性不感兴趣。

for (var starName in star) {
    if (star.hasOwnProperty(starName) &&
        typeof star[starName] !== 'function') {

        // Do your thing
    }
}

答案 1 :(得分:1)

也许这会有所帮助:for(newVariable in existingVariable);

for循环结构创建一个新变量,您可以将其用作循环中的当前值。第二个值是您要循环的变量。

正如Bryan所指出的,for-in构造只在可枚举属性上循环。如果您想检查某些内容是否可枚举,可以在其上调用.propertyIsEnumerable(0)

答案 2 :(得分:1)

如何工作,star是一个具有多个值的数组(或对象)。想象一个数字为1到10的数组。

in关键字遍历数组并将值分配给starName。因此,数字1到10的数组将迭代10次,每次starName将成为下一个值。

订单基于数组(或对象)的索引

答案 3 :(得分:0)

这种结构

for(var key in collection) { ... }

允许迭代JS集合(对象/映射和数组)中的可枚举键。 在每次迭代key将获得集合中包含的新键值。

注意#1:for(...in...)具有“酷”特征,不仅可以通过对象本身定义的键进行迭代,还可以在原型中进行迭代。

注意#2:关键变量前面应该有'var'关键字,以便此循环有效工作。如果没有'var','key'变量将在全局命名空间中创建。