5

首先,我想说我在理论上很厉害。我不喜欢抽象。在尝试使用它们之前,我想知道它们是如何工作的。我一直在到处寻找一个简单的理论来获取 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

4 回答 4

4

我不得不承认我没有完全理解这个问题,但我还是尽量回答。一个对象几乎可以与哈希(- table)相媲美。如您所知,它由一个标识符和一个存储在该标识符后面的值组成。

在 ECMAscript 中,该标识符是object中的

对于Array,您在循环它时只希望收到一件有趣的事情,因为它的“”只是索引数字(实际上这里也是字符串,但这只是一个旁注)。但是,由于对象可以是任何东西,因此在循环它们时会发生冲突。你想得到还是

这就是为什么有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
}
于 2012-11-23T12:10:04.900 回答
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等等。

如果您想了解所有详细信息,请参阅以下规范:

于 2012-11-23T12:09:25.570 回答
1

prop 是存储另一个引用的引用?

不,prop是您在迭代中达到的元素的键。一个字符串。

而已。没有比这更复杂的了。

你不能说 var "string" = "Hello, World!"; 因为那是非法的

这也是一个完全不同的语言功能......

可以说,提供对象至少部分是为了解决您确定的限制。

于 2012-11-23T12:13:17.577 回答
1

JavaScript 对象是一个字典,键是任意字符串,不一定是有效的 JavaScript 标识符。因此,有些东西可以用作属性名称(即任何有效字符串),但不能用作变量名称。

For/in 被定义为遍历(可枚举的)属性名称(即键),这对于数组也是如此,这样

for (var i in [10,20,30]) document.write (i);

将打印“012”,而不是“102030”。

可以将属性定义为不可枚举的,在这种情况下 for/in 将跳过它。在 ECMAScript 5 中,您可以自己定义不可枚举的属性。枚举顺序未定义。请注意,for/in 还考虑了原型的属性(这就是您经常会hasOwnProperty在循环内立即看到条件的原因)。

于 2012-11-23T12:04:55.193 回答