2013-06-05 9 views
2

我正在通过codeacademy的javascript练习之一,并遇到此问题。以下代码由codeacademy提供。基本的javascript - 引用数组中的对象

var friends = { 
    bill: { 
     firstName: "Bill", 
     lastName: "Gates", 
     number: "1", 
     address: ['abc', 'def', 'ghi'] 
    }, 
    steve: { 
     firstName: "Steve", 
     lastNAme: "Jobs", 
     number: "2", 
     address: ['abc', 'def', 'ghi'] 
    } 
}; 

var list = function(obj) { 
    for (var prop in obj) { 
     console.log(prop); 
    } 
}; 

var search = function(name) { 
    for (var prop in friends) { 
     if (friends[prop].firstName === name) { 
      console.log(friends[prop]); 
      return friends[prop]; 
     } 
    } 
}; 

我不明白的是,在搜索功能中,为什么我需要写出'朋友[道具]'而不是'道具'。如果for/in循环遍历好友(数组?)中的每个属性,为什么我需要再次指定每个prop属于哪个数组?为什么我不能使用下面的代码?

var search = function(name) { 
    for (var prop in friends) { 
     if (prop.firstName === name) { 
      console.log(prop); 
      return prop; 
     } 
    } 
}; 
+1

嗯,这是因为JavaScript中的循环有点混乱。检查http:// stackoverflow。com/a/9329476/60518 –

+0

请阅读我对我的答案所作的编辑 - 这很重要,否则可能会遇到意外错误。 – Christoph

回答

6

prop实际上是对象的属性(=键),而不是物业本身。这是一个普通的字符串("bill"),而不是实际的对象friends.bill(/对它的引用)。

这也是原因,为什么你写

friends[prop] // prop gets evaluated here, it's value is the identifier 

,而不是

friends.prop // prop is treated as the identifier here 

例子:

var friends = { 
    bill: { ... 
    } 
} 
for (var prop in friends) { 
    // prop == "bill"; 
    friends[prop] == friends.bill 
} 

其实,这是类似的(新)Object.keys(friends)其中返回一个你可以迭代的对象的所有属性名称的数组(这也许是我对于来自其他语言的人更直观)。

编辑:一个重要的说明!

不像Object.keys()for in列出所有属性的对象,即使是那些从它的原型继承。所以,如果你要确保你只能得到你的“原生”的属性,你总是要check if it's a genuine property of the object

for (var prop in friends) { 
    if (friends.hasOwnProperty(prop)){ 
     // it's a true property of your object 
    } 
} 
+0

非常好的解释。 – andlrc

2

for..in迭代的键对象,而不是值。

如果你熟悉PHP:

foreach ($friends as $prop => $value) ... 

for..in只给你$prop,不$value。要获得$value,您需要使用$friends[$prop],或使用Javascript条款friends[prop]

1

将变量prop想象为键 - >值配对中的关键。

声明friends[prop]指定了名为prop的键friends的值。

如果你不是说prop.firstname,你实际上是指定的财产分配给prop字符串,这是没有意义的firstname,因为prop不是一个对象。