2

我正在经历一个 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 循环遍历朋友(数组?)中的每个属性,为什么我需要再次指定每个属性所属的数组?为什么我不能使用以下代码?

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

3 回答 3

6

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 
}

实际上,这类似于 (new) Object.keys(friends),它返回一个包含对象的所有属性名称的数组,然后您可以对其进行迭代(这对于来自其他语言的人来说可能更直观一些)。

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

与 不同Object.keys()for in列出对象的所有属性,甚至是从其原型继承的属性。因此,如果您想确保只获得“本机”属性,则始终必须检查它是否是对象的真实属性

for (var prop in friends) {
    if (friends.hasOwnProperty(prop) ){
         // it's a true property of your object
    }
}
于 2013-06-05T09:02:15.470 回答
2

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

如果您熟悉 PHP:

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

for..in只给你$prop,没有$value。要获得$value,您需要使用$friends[$prop]Javascript 或 Javascript 术语friends[prop]

于 2013-06-05T09:03:15.877 回答
1

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

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

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

于 2013-06-05T09:11:48.567 回答