2013-06-05 7 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不是一個對象。