2011-07-21 65 views
0

我在这里失去..我现在对这个循环如何工作非常困惑。For .. in loop?

从W3学校:

var person={fname:"John",lname:"Doe",age:25}; 

for (x in person) 
{ 
document.write(person[x] + " "); 
} 

人是有属性的对象吧?那些属性如何用括号访问?我认为这是数组?

为什么这个也行,而不应仅是这个样子?:

var person=[]; 
person["fname"] = "John"; 
person["lname"] = "Doe"; 
person["age"] = "25"; 


for (x in person) 
{ 
document.write(person[x] + " "); 
} 
+2

@ThiefMaster:我想知道他们是否保留问号键或者他们是否反复按下。除了奇怪的是他们为什么要做这些事情之一。无论如何,当他们这样做时,我可以想象到“疯狂grrrrrr愤怒”的脸... –

+3

@ ThiefMaster“请更少的问号。” – skyfoot

+0

对不起,我很累,有点沮丧。编程是如此表达清楚,没有感情,但我觉得需要表达一点。 – mowwwalker

回答

3

有些情况下,你可以使用一个对象的属性两种方式:

  • obj.key
  • obj['key']

第二种方法的优点是,你还可以动态提供关键,例如在你的例子中为obj[x]obj.x字面意思是x属性(即obj['x']),这不是你想要的。

数组只能使用括号,但括号不限于数组。数组也在对象之下,但是为数字键设计。你可以仍然添加属性与非数字键给他们,但这不是他们设计的。

0

JavaScript对象的属性可以用两种对象[关键]和object.key(和一些其他的方式来访问,最可能)。只是他们的工作方式。

你的第二个例子,数组是一个特殊的对象,但仍然是一个对象。

+0

第二个例子是* not *一个数组。 – KooiInc

+0

当然! 'var person = [];'创建一个数组。 – binarious

+0

我说这是一个对象,因为数组是一个对象:-) – ikanobori

0

在js对象中是asociative数组,意味着它们不过是一组键 - 值对。
如果你对制动器感到困惑,不要这样! Javascript对象属性可以通过“。”来加以说明。或“[]”构造:

var a = {key : 'val'}; 
alert(a['key'] === a.key); 

在大多数情况下,它们的工作原理是相同的。
这只是一个喜好和浏览器实现的问题(例如:firefox在括号内工作得更快,而chrome的工作速度更快)。
有些情况下,点构造将失败:supose有一个对象,其中有一个名为“some-key”的属性。
如果你想用点符号来访问它:object.some-key,你肯定会得到一个错误,因为代码被解释为两个值之间的差异:object.some - key。在这种情况下,您应该使用括号:object['some-key']
还有其他一些情况,其中密钥包含一个特殊字符,例如.,,,;,\,* ......等已经在JavaScript中有解释。

0

您可以在JavaScript中使用括号运算符来访问Object文字以及Arrays。对于对象,括号操作符通过将括号中的值转换为String(如果不是String)并检查它是否确实属于某个属性(mdc)来访问Object的成员。

你的第二个例子建议使用JavaScript中不鼓励使用的“关联数组”(link)。

要回答你的问题:编写Map类似结构的标准方式(即imo) - 即一个保存键值对的对象 - 使用for-in循环进行迭代是Object对象字面量;编写更传统阵列的标准方式是ArrayObject

var map = { "a": "string" , "b": 0 , "c": null } ; 

    for(key in map) console.log("(!!) map # " + key + " : " + map[key]) ; 

var list = ["string",0,null] ; 

    for(i = 0 ; i < list.length ; i++) console.log("(!!) list # " + i " : " + list[i]) ;