这个“for..in”语句为什么以及如何工作?

时间:2013-08-30 17:55:44

标签: javascript for-in-loop

我正在通过CodeCademy学习JavaScript并参与“联系人列表”项目;具体来说,“搜索朋友”课程。它让我学习对象如何工作以及如何在其中查看。

演示的代码如下:

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是一个对象,而billstevefriends中的对象。我不明白的是listsearch函数在friends内的看法。我看到它使用for/in循环...但是在学习循环后,我看不到任何条件,我看不到迭代机制。我没有关于for/in实际如何工作的概念。也许如果有人可以提供替代的等效语法;也许,甚至,如果有人能用口语英语解释为什么/如何 for/in有效?

谢谢!

注意:标记为语言不可知,因为它是一个更高级别的编程/概念问题,即使这里的语法是JavaScript。

3 个答案:

答案 0 :(得分: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 ==“a”。恰好一次,x ==“b”。恰好一次,x ==“c”。只有那些,没有指定的顺序。

答案 1 :(得分:1)

简而言之,您的for(var prop in obj)等同于obj有项目,获取prop并使用它做一些事情(用简单的英语)。因此,当没有其他“道具”从“obj”中取出时,循环将停止。

以下是for / in循环的详细说明:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...in

答案 2 :(得分:1)

在你的情况下(朋友的var prop)“prop”代表键。之后你可以使用像朋友[prop] .anyProperty。

这样的东西

使用更有意义:

 for(var key in friends)  

关于“for in”:

来自Douglas Crockford的“Javascript The Good Parts”预订:

for in语句可以遍历对象中的所有属性名称。枚举 将包括所有属性 - 包括函数和原型属性 您可能不感兴趣 - 所以有必要过滤掉这些值 你不想要的。最常见的过滤器是hasOwnProperty方法并使用 typeof to exclude functions:

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

无法保证名称的顺序,因此请为名称做好准备 以任何顺序出现。如果要确保属性出现在特定的属性中 顺序,最好完全避免使用for语句,而是生成一个包含的数组 正确顺序的属性名称:

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

通过使用for而不是in,我们能够获得我们想要的属性 担心可能会从原型链中挖掘出什么,我们得到了 他们按正确的顺序。