在for..in
循环中,
为什么当以o.i
访问时,属性的值返回undefined
但o[i]
返回正确的值?
参考代码段:
var object = {
id:2,
name:'axs',
address:'colon street'
};
for(let property in object){
console.log(object.property); // returns undefined
console.log(object[property]); // returns property-value
}
答案 0 :(得分:4)
o.i
将在i
中寻找属性Object
,但是当您进行o[i]
时,它将寻找评估的财产i
,它可能是:{{ 1}},name
等...
尽管使用id
表示法获取属性时,不会对该变量求值,但认为您正在尝试获取属性dot
本身。
答案 1 :(得分:1)
在for..in
循环中,property
作为 string 分配给变量,即在循环内部,typeof(i)
将始终返回"string"
。 MDN explanation介绍for..in
的工作方式。
使用点符号访问时,引擎将尝试读取为o."name"
,正确地将其读取为undefined
。请注意,o.name
和o."name"
是两件事。
使用访问对象的属性
the dot notation-property
必须是有效的JavaScript标识符,即property
将被评估以返回所需的值。
the bracket notation-property
总是 一个字符串。该字符串不必是有效的标识符,它可以具有任何值,例如“ 1foo”,“!bar!”,甚至“”(一个空格)。
PS
使用for..in
访问对象属性时,请注意是否只考虑对象的属性,而不考虑对象的原型。在这种情况下,请使用getOwnPropertyNames()
或执行hasOwnProperty()
检查。 MDN explanation
答案 2 :(得分:0)
它们是访问对象属性的不同方法。 o.i等同于o ['i'],在您的情况下不存在,因此返回undefined。
答案 3 :(得分:0)
表达式object.property
返回未定义,因为在property
上找不到名为object
的属性。
答案 4 :(得分:0)
因为点符号将property
视为所使用对象的属性。要将for-in
循环中的“属性”用作变量,您需要使用方括号访问器。
如果您为对象提供“属性”属性,则该属性会按预期工作:
var object = {
id:2,
name:'axs',
address:'colon street',
property:'residential'
};
for(let property in object){
console.log(object.property); // returns 'residential'
console.log(object[property]); // returns property-value
}