1

我正在通过 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是一个对象,bill并且stevefriends. 我不明白的是内部的外观listsearch功能friends。我看到它使用了for/in循环......但是在学习循环之后,我看不到任何条件,也看不到迭代机制。我不知道这for/in实际上是如何工作的。也许如果有人可以提供等效语法的替代方案;也许,甚至,如果有人可以用口语解释为什么/如何 for/in工作?

谢谢!

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

4

3 回答 3

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"。只有那些,没有指定的顺序。

于 2013-08-30T18:03:22.497 回答
1

在您的情况下 for(var prop in friends) “prop” 代表键。之后你可以使用friends[prop].anyProperty之类的东西。

使用它会更有意义:

 for(var key in friends)  

关于“for in”:

来自 Douglas Crockford 的“Javascript The Good Parts”一书:

for in 语句可以遍历对象中的所有属性名称。枚举将包括所有属性——包括你可能不感兴趣的函数和原型属性——因此有必要过滤掉你不想要的值。最常见的过滤器是 hasOwnProperty 方法和使用 typeof 来排除函数:

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

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

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 而不是 for in,我们能够得到我们想要的属性,而不用担心会从原型链中挖出什么,并且我们以正确的顺序得到了它们。

于 2014-01-09T20:41:40.110 回答
1

简而言之,你的for(var prop in obj), 相当于 while objhas items, get propand do something with it(用简单的英语)。因此,当“obj”中没有其他“道具”时,循环将停止。

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

于 2013-08-30T18:10:03.697 回答