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

Javascript 从for-in循环中获取属性名称背后的简单理论?,javascript,arrays,oop,object,loops,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.l

首先,我想说的是,我在理论上很有天赋。我不喜欢抽象。在尝试使用它们之前,我想知道它们是如何工作的。我一直在到处寻找获取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”=“你好,世界!”;因为这是非法的。

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

For/in被定义为在(可枚举的)属性名称(即键)上循环,这对于数组也是如此,例如

for (var i in [10,20,30]) document.write (i);
将打印“012”,而不是“102030”


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

对象属性的名称是字符串,
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
等等

如果需要所有详细信息,请参阅以下各项的规范:


我必须承认我不完全理解这个问题,但我还是尽力回答。对象与散列(-table)非常相似。正如您所知,它由一个标识符和一个存储在该标识符后面的值组成

在ECMAscript中,该标识符是对象中的键

对于一个数组,当在其上循环时,只有一件有趣的事情需要接收,因为它的“键”只是索引的数字(实际上这里也是字符串,但这只是一个旁注)。但是,由于对象键可以是任何东西,因此在循环它们时存在冲突。要获取键还是值

这就是为什么在循环中存在for的原因。您正在循环使用这些键,并且使用该键还可以访问后面的值


然而,你并不是完全孤独地面对困惑。这就是ECMAscript接下来将为对象引入
for of
循环的原因,这将反转此逻辑。您将直接在值上循环,而不是键

var obj = { one: 1, two: 2, three: 3 };

for(var value of obj) {
    console.log(value); // 1, 2, 3
}
prop是存储另一个引用的引用吗

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

就这样。没有比这更复杂的了

你不能说var“string”=“你好,世界!”;因为那是违法的

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


可以说,提供对象至少在一定程度上是为了解决您已经确定的限制。

我没有背景来解释JavaScript,但听起来您的答案将与“反射”相关。您在理论上很了不起,但不喜欢抽象?不…不…计算…我一伊一伊。。。我的语法很糟糕。我的意思是我不喜欢抽象的东西。比如,如果你知道我的意思,我想让你尽可能详细地解释它。@W3Geek:听起来你在理论上很强大——实际实现:)这很酷。我从来不知道你可以用一个for-in循环和一个数组。向上一个!缺点是永远不要在数组中使用for-in循环,它比for循环慢一个数量级,使用扩展方法中断并且迭代顺序不确定decmascript 5应该解决这个问题:
[10,20,30]。forEach(函数(i){document.write(i);})
打印“102030”`至少对于极客和唯美主义者来说,这比
for
循环要好得多。他们(for in和for of)都不理想,都不应该只提供语法来在同一个循环中公开键和值:P有点像php:
for(value in obj)
for(key,value in obj)
或者我同意的任何东西——我喜欢php的数组循环语法。这是它唯一的优点。