从for-in循环获取属性名称背后的简单理论?

时间:2012-11-23 12:01:29

标签: javascript arrays oop object loops

首先,我想说我理论上很重要。我不喜欢抽象。我想在尝试使用它们之前知道它是如何工作的。我一直在寻找一个简单的理论来获取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!”;因为那是非法的。

4 个答案:

答案 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] = keya[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!”;因为那是非法的

这也是一种完全不同的语言特征......

可以说,对象至少部分提供以解决您已识别的限制。