基本javascript-引用数组中的对象

基本javascript-引用数组中的对象,javascript,Javascript,我在进行codeacademy的javascript练习时遇到了这个问题。以下代码由codeacademy提供 var friends = { bill: { firstName: "Bill", lastName: "Gates", number: "1", address: ['abc', 'def', 'ghi'] }, steve: { firstName: "Steve",

我在进行codeacademy的javascript练习时遇到了这个问题。以下代码由codeacademy提供

var friends = {
    bill: {
        firstName: "Bill",
        lastName: "Gates",
        number: "1",
        address: ['abc', 'def', 'ghi']
    },
    steve: {
        firstName: "Steve",
        lastNAme: "Jobs",
        number: "2",
        address: ['abc', 'def', 'ghi']
    }
};

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];
        }
    }
};
我不明白的是,在搜索功能中,为什么我需要写“friends[prop]”而不是“prop”。如果for/in循环正在迭代friends(数组?)中的每个属性,为什么我需要再次指定每个道具属于哪个数组?为什么我不能使用以下代码

var search = function(name) {
    for (var prop in friends) {
        if (prop.firstName === name) {
            console.log(prop);
            return prop;
        }
    }
};

prop
实际上是对象属性(=key)的名称,而不是属性本身。它是一个普通字符串(
“bill”
),而不是实际的对象
friends.bill
(/对它的引用)

这也是你写作的原因

friends[prop] // prop gets evaluated here, it's value is the identifier
而不是

friends.prop  // prop is treated as the identifier here
例如:

var friends = {
    bill: { ...
    }
}
for (var prop in friends) {
    // prop == "bill";
    friends[prop] == friends.bill 
}
实际上,这与(新的)类似,它会返回一个数组,其中包含对象的所有属性名,然后可以对其进行迭代(对于来自其他语言的人来说,这可能更直观一些)

编辑:一个重要的注意事项

Object.keys()
不同,《for in中的
列出了对象的所有属性,甚至是从其原型继承的属性。因此,如果您想确保只获得“本地”属性,您必须始终:


for..in
迭代对象的键,而不是值

如果您熟悉PHP:

foreach ($friends as $prop => $value) ...

for..in
仅为您提供
$prop
,而不是
$value
。要获取
$value
,您需要使用
$friends[$prop]
,或者用Javascript术语
friends[prop]

将变量
prop
视为键->值对中的键

语句
friends[prop]
指定了对象
friends
名为
prop
的键的值


如果您改为说
prop.firstname
,实际上是在指定分配给
prop
的字符串的属性
firstname
,这毫无意义,因为
prop
不是对象。

这是因为JavaScript中的for循环有点混乱。检查请阅读我对答案的编辑-这非常重要,否则您可能会遇到意外错误。
foreach ($friends as $prop => $value) ...