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

jee*_*ace 2 javascript

我正在经历一个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];
        }
    }
};
Run Code Online (Sandbox Code Playgroud)

我不明白的是,在搜索功能中,为什么我需要写出'friends [prop]'而不仅仅是'prop'.如果for/in循环遍历friends中的每个属性(数组?),为什么我需要再次指定每个prop所属的数组?为什么我不能使用以下代码?

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

Chr*_*oph 6

prop实际上是对象的属性(=键),而不是物业本身.它是一个普通的字符串("bill")而不是实际的对象friends.bill(/对它的引用).

这也是你写作的原因

friends[prop] // prop gets evaluated here, it's value is the identifier
Run Code Online (Sandbox Code Playgroud)

代替

friends.prop  // prop is treated as the identifier here
Run Code Online (Sandbox Code Playgroud)

例:

var friends = {
    bill: { ...
    }
}
for (var prop in friends) {
    // prop == "bill";
    friends[prop] == friends.bill 
}
Run Code Online (Sandbox Code Playgroud)

其实,这是类似的(新)Object.keys(friends)返回你的对象,那么你可以遍历(这也许是人们从其他语言更直观一点)的所有属性名的数组.

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

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

for (var prop in friends) {
    if (friends.hasOwnProperty(prop) ){
         // it's a true property of your object
    }
}
Run Code Online (Sandbox Code Playgroud)