Проблема в доступе к объекту JavaScript при зацикливании
В 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
}
5 ответов
o.i
будет искать недвижимость i
в Object
но когда вы делаете o[i]
он ищет оцененное свойство i
который может быть: name
, id
, так далее...
При получении свойств с dot
примечание, переменная не оценивается, считается, что вы пытаетесь получить свойство i
сам.
В for..in
петли, property
присваивается переменной в виде строки, то есть внутри цикла, typeof(i)
всегда вернется "string"
, Объяснение MDN о том, как for..in
работает.
При обращении с точечной нотацией двигатель пытается прочитать как o."name"
, который он правильно находит как undefined
, пожалуйста, обратите внимание o.name
а также o."name"
это 2 разные вещи.
Доступ к свойствам объекта с помощью
точечная запись -
property
должен быть действительным идентификатором JavaScript, т.е.property
будет оценен, чтобы вернуть требуемое значение.обозначение скобки -
property
всегда строка Строка не обязательно должна быть допустимым идентификатором, она может иметь любое значение, например, "1foo", "! Bar!" Или даже " " (пробел).
PS
При доступе к свойствам объекта с for..in
Обратите внимание, если вы хотите учитывать свойства, связанные только с объектом, а не с его прототипами. В таком случае используйте getOwnPropertyNames()
или выполнить hasOwnProperty()
проверять. Объяснение MDN
Выражение object.property
возвращает неопределенное значение, потому что нет имени property
находится на object
,
Это разные способы доступа к свойствам объекта. oi эквивалентно o['i'], которого в вашем случае нет, поэтому возвращается undefined.
Поскольку точечная запись видит property
в качестве свойства объекта используется. Чтобы использовать "свойство" из for-in
В качестве переменной необходимо использовать квадратные скобки.
Если вы передаете свой объект свойству 'property', он работает как положено:
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
}