2013-08-30 85 views
1

我正在通過CodeCademy學習JavaScript,並在「聯繫人列表」項目中進行學習;具體來說,「搜索一個朋友」的教訓。它讓我學習對象如何工作以及如何看待對象。爲什麼以及這個「for..in」聲明如何工作?

的證明代碼如下:

var friends = {}; 
friends.bill = { 
    firstName: "Bill", 
    lastName: "Gates", 
    number: "(206) 555-5555", 
    address: ['One Microsoft Way','Redmond','WA','98052'] 
}; 
friends.steve = { 
    firstName: "Steve", 
    lastName: "Jobs", 
    number: "(408) 555-5555", 
    address: ['1 Infinite Loop','Cupertino','CA','95014'] 
}; 

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]; 
    } 
    } 
}; 

list(friends); 
search("Steve"); 

所以我明白friends是一個對象和billsteve是內friends對象。我不明白listsearch函數如何看friends。我發現它使用了一個for/in循環......但在學習循環之後,我看不到任何條件,並且我看不到任何迭代機制。我對這個for/in如何實際工作沒有任何概念。也許如果有人可以提供一個替代的等效語法;或許,甚至,如果有人可以用口語英語解釋爲什麼/如何for/in工作?

謝謝!

注意:標記爲語言不可知的,因爲它是一個更高級別的編程/概念問題,即使這裏的語法是JavaScript。

回答

3

沒有真正的等效替代語法; for (x in y)的迭代機制。

這是類似於

for (x = 0; x < somearray.length; ++x) 

,它集x來依次在每個指標。但是因爲按照定義,JS對象是無序的,所以不能保證你會得到任何特定順序的索引。

沒有條件。你會擊中每一個索引。這是一個不同的構造。

因此,如果我們有:

var obj = { 'a': 1, 'b': 2, 'c': 3 }; 

說:

for (var x in obj) 
{ 
    console.log(x + ": " + obj[x]); // prints "a: 1", etc. 
} 

則恰好一次在該循環,x == 「是」。正好一次,x ==「b」。正好一次,x ==「c」。只有那些,沒有特定的順序。

+0

你可以像'Object.keys(obj).forEach(...);'這相當於'for in'循環。 – plalx

+0

所以你說的是在'for(var x in obj)'中,'x'對應於'a','b'等鍵?當我運行'for ... in'循環時,它會迭代並在每次迭代中分配'x = a','x = b'等等。 編輯:另外,'obj [x]'指的是鍵'a','b'等,並返回值('1','2'等)? – jwarner112

+0

是的。當'x =='a'','obj [x] == obj ['a']',在例子中等於'1' –

1

在你的情況下(在朋友VAR道具) 「託」 代表的鍵。之後你可以使用像朋友[prop] .anyProperty之類的東西。

這將是更有意義的使用:

for(var key in friends) 

關於 「對」:

從道格拉斯Crockford的「的Javascript好的部分」書:

的在聲明可以遍歷對象中的所有屬性名稱。枚舉 將包含您可能不感興趣的所有屬性(包括函數和原型屬性 ),因此有必要過濾出您不想要的值 。最常用的過濾器是hasOwnProperty方法和使用 的typeof排除功能:

var name; 
for (name in another_stooge) { 
if (typeof another_stooge[name] !== 'function') { 
    document.writeln(name + ': ' + another_stooge[name]); 
} 
} 

有名字的順序沒有保證,所以要爲名稱 出現在任何順序編寫。如果你想確保該屬性將出現在一個特定的 秩序,最好避免在聲明中對完全,而是使含有正確的順序屬性 名字的數組:

var i; 
var properties = [ 
    'first-name', 
    'middle-name', 
    'last-name', 
    'profession' 
]; 


for (i = 0; i < properties.length; i += 1) { 
    document.writeln(properties[i] + ': ' + 
    another_stooge[properties[i]]); 
} 

通過使用替代原因,我們能夠得到我們想要的屬性,而不用 擔心可能從原型鏈中挖出什麼,我們得到 他們在正確的順序。

相關問題