2013-08-30 49 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]]); 
} 

通过使用替代原因,我们能够得到我们想要的属性,而不用 担心可能从原型链中挖出什么,我们得到 他们在正确的顺序。

相关问题