我正在通过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中的每个属性(数组?),为什么我需要再次指定每个prop所属的数组?为什么我不能使用以下代码?
var search = function(name) {
for (var prop in friends) {
if (prop.firstName === name) {
console.log(prop);
return prop;
}
}
};
答案 0 :(得分: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
}
实际上,这类似于(新的)Object.keys(friends)
,它返回一个你可以迭代的对象的所有属性名称的数组(这对于来自其他语言的人来说可能更直观)
编辑:一个重要的注意事项!
与Object.keys()
不同,for in
列出了对象的所有属性,甚至包括从其原型继承的属性。因此,如果您想确保只获得“原生”属性,则必须始终check if it's a genuine property of the object:
for (var prop in friends) {
if (friends.hasOwnProperty(prop) ){
// it's a true property of your object
}
}
答案 1 :(得分:2)
for..in
迭代对象的键,而不是值。
如果你熟悉PHP:
foreach ($friends as $prop => $value) ...
for..in
仅向您$prop
提供,而不是$value
。要获得$value
,您需要使用$friends[$prop]
或Javascript条款friends[prop]
。
答案 2 :(得分:1)
将变量prop
视为key->值配对中的键。
语句friends[prop]
指定了名为prop
的对象friends
的值。
如果您改为说prop.firstname
,实际上是指定了分配给firstname
的字符串的属性prop
,这是没有意义的,因为prop
不是对象