Javascript 从for-in循环中获取属性名称背后的简单理论?
首先,我想说的是,我在理论上很有天赋。我不喜欢抽象。在尝试使用它们之前,我想知道它们是如何工作的。我一直在到处寻找获取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
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
等等
如果需要所有详细信息,请参阅以下各项的规范:
然而,你并不是完全孤独地面对困惑。这就是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的数组循环语法。这是它唯一的优点。