我正在通过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
和steve
是friends
中的对象。我不明白的是list
和search
函数在friends
内的看法。我看到它使用for/in
循环...但是在学习循环后,我看不到任何条件,我看不到迭代机制。我没有关于for/in
实际如何工作的概念。也许如果有人可以提供替代的等效语法;也许,甚至,如果有人能用口语英语解释为什么/如何 for/in
有效?
谢谢!
注意:标记为语言不可知,因为它是一个更高级别的编程/概念问题,即使这里的语法是JavaScript。
答案 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,我们能够获得我们想要的属性 担心可能会从原型链中挖掘出什么,我们得到了 他们按正确的顺序。