Проблема в доступе к объекту 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
}

Другие вопросы по тегам