基本引用数组中的对象

basic referring to an object in an array

本文关键字:对象 数组 引用      更新时间:2023-09-26

我在参加一个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];
        }
    }
};

我不明白的是,在搜索功能中,为什么我要写"朋友[道具]"而不是"道具"。如果for/in循环遍历朋友(数组?)中的每个属性,为什么我需要再次指定每个道具属于哪个数组?为什么我不能使用下面的代码?

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(friends),它返回您可以迭代的对象的所有属性名称的数组(这可能是一个更直观的人来自其他语言)。

编辑:一个重要的提示!

Object.keys()不同的是,for in列出了对象的所有属性,甚至包括从它的原型继承的属性。因此,如果你想确保你只获得你的"原生"属性,你总是需要检查它是否是对象的真正属性:
for (var prop in friends) {
    if (friends.hasOwnProperty(prop) ){
         // it's a true property of your object
    }
}

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,你实际上是指定属性firstname的字符串分配给prop,这没有意义,因为prop不是一个对象。