首先,我想说我理论上很重要。我不喜欢抽象。我想在尝试使用它们之前知道它是如何工作的。我一直在寻找一个简单的理论来获取for-in循环的属性名称(而不是值)。我将在代码中演示它,所以希望有人可以解释它是如何工作的......
var obj = { one: 1, two: 2, three: 3 }; // A basic object instantiated with 3 public properties.
for (var prop in obj) {
console.log(prop); // logs "one", "two" and "three" ???
}
我认为它会将prop变量评估为1,2和3,但它会记录实际的属性名称。我知道obj [prop]是评估这些属性的实际价值的东西,但这对我来说就像是一个开始。 prop是一个存储另一个引用的引用吗?
我试图从for循环中的变量i有点像数组的索引来考虑这个。
这又是什么,它与我的要求相似?
var obj = { "one": 1, "two": 2, "three": 3 };
属性如何命名字符串?...你不能说var“string”=“Hello,World!”;因为那是非法的。
答案 0 :(得分:4)
我必须承认我并不完全理解这个问题,但我仍尽力尽力回答。 对象与 hash ( - table )非常相似。如您所知,它由标识符和存储在该标识符后面的值组成。
在ECMAscript中,该标识符是对象中的键。
对于数组,循环时只有一个有趣的东西,因为它的“键”只是索引号(实际上是这里也是 Strings ,但这只是一个旁注)。但是,由于对象键可以是任何东西,因此在循环它们时会发生冲突。您想获取密钥或值吗?
这就是for-in
循环的原因。您正在循环键并使用该键可能还会访问后面的值。
然而 - 你并不是完全孤独的混乱。这就是为什么 ECMAscript Next 将为对象引入for-of
循环,这会颠倒这个逻辑。您将直接循环遍历值,而不是键。
var obj = { one: 1, two: 2, three: 3 };
for(var value of obj) {
console.log(value); // 1, 2, 3
}
答案 1 :(得分:3)
对象属性的名称是字符串,当obj.prop
是有效标识符时,obj["prop"]
只是prop
的语法糖。例如,你不能说obj.my property
,你必须写obj["my property"]
for..in
枚举对象及其原型链中的可枚举键,将当前字符串键分配给左侧。所以你可以这样做:
var a = [], i = 0;
for( a[i++] in obj );
//a is an array: ["one", "two", "three"]
随着循环的进行,左侧被评估为参考(i
增量作为其副作用)并分配当前密钥。所以它看起来像a[0] = key
,a[1] = key2
等等。
如果您需要所有详细信息,请参阅以下规范:
答案 2 :(得分:1)
JavaScript对象是一个字典,其中的键是任意字符串,不一定是有效的JavaScript标识符。因此,有些东西可以用作属性名称(即任何有效的字符串),但不能用作变量名。
for / in被定义为遍历(可枚举)属性 names (即键),对于数组也是如此,这样
for (var i in [10,20,30]) document.write (i);
将打印“012”,而不是“102030”。
可以将属性定义为不可枚举,在这种情况下,/ in将跳过它。在ECMAScript 5中,您可以自己定义不可枚举的属性。枚举顺序未定义。请注意,对于/ in也会考虑原型的属性(这是因为您将经常在循环内看到hasOwnProperty
条件这一事实。)
答案 3 :(得分:1)
prop是一个存储另一个引用的引用吗?
不,prop
是您在迭代中达到的元素的关键。一个字符串。
就是这样。没有比这更复杂的了。
你不能说var“string”=“Hello,World!”;因为那是非法的
这也是一种完全不同的语言特征......
可以说,对象至少部分提供以解决您已识别的限制。