我正在制作一个基本的学习脚本。我的主要问题是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>
答案 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'变量将在全局命名空间中创建。