JS — разница между периодом и [] при доступе к объекту JSON

В чем разница между доступом к объекту JSON с использованием точки (.) и нотации [] в Javascript. Например,

var person = {
    "firstName": "Foo", 
    "lastName":"Bar"
}

Я уверен, что доступ к переменным "firstName" и "lastName" дает мне один и тот же тип вывода (строку), т.е.

console.info(typeof person.firstName); // returns string
console.info(typeof person.lastName); // returns string

Кроме того, доступ к нему обоими способами, используя . или [] даст мне тот же результат:

console.info(person.firstName); // returns Foo
console.info(person['firstName']); // returns Foo

Я пытаюсь понять, когда использовать какие обозначения, а когда нет, и реальную разницу между ними. Я где-то читал, что мы не можем использовать точечную запись, если данные сложны, я не уверен, что это значит, проверил пару образцов входных данных:

"firstName": " Foo Bar "
"firstName": "@#@#$% Foo Bar!!!" 

Интересно, что оба дают мне один и тот же результат, может кто-нибудь объяснить мне, в чем фактическая разница между этими двумя обозначениями и когда к ним обращаться?

console.info(человек['имя']); также должен возвращать Foo, а не Bar

Akin Hwan 30.01.2019 18:43

Это опечатка, исправил! Спасибо за указание!

Vamsi Vikash 30.01.2019 18:45

доступ с помощью [] больше используется, когда свойство будет динамическим, и вы не знаете, будет ли это firstName или lastName (возможно, потому, что он исходит от выбора пользователя или чего-то еще), поэтому вы сохраняете его в переменной и используете имя переменной, например : person[variableName]. Но в любом случае, оба метода действительны

Calvin Nunes 30.01.2019 18:45

Я нашел несколько дубликатов, просто погуглив название, не внося никаких изменений. См.: Какие исследовательские усилия ожидаются от пользователей Stack Overflow?

adiga 30.01.2019 18:52

Здесь уже существуют три БОЛЬШИХ ответа: stackoverflow.com/a/4968448/5411817, stackoverflow.com/a/11922384/5411817 и stackoverflow.com/a/50738382/5411817.

SherylHohman 30.01.2019 19:52
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
7
159
7

Ответы 7

Оба они являются допустимыми способами доступа к значениям объекта.

Эта статья очень плохая, нет такой вещи, как "объект JSON". У них часто отсутствует или просто неправильный контент, и вместо этого вам следует взглянуть на МДН.

str 30.01.2019 18:51

Добро пожаловать в Stackoverflow!

Основное различие между ними заключается в том, что использование нотации в квадратных скобках позволяет вам определять и получать доступ к свойствам с пробелами в них, чего нельзя сделать с точечной нотацией.

var foo = {
 "I AM BAR": 1 
}

Если бы вы хотели получить доступ к единственному свойству "I AM BAR" на foo с обозначением скобок, это выглядело бы так: foo["I AM BAR"]. Это невозможно при записи через точку.

Это имеет смысл, забыл проверить это. Спасибо @Pyth

Vamsi Vikash 30.01.2019 18:47

Разницы нет. Подход [] полезен, когда вам нужно найти ключ с переменной. Нравится:

const theKey = 'test';
theArray[theKey]; // this work
theArray.theKey; // this dont work

Используя точечную нотацию, вы должны указать точное имя свойства, но вы можете работать с именем при использовании [].

var person = {
    "firstName": "Foo", 
    "lastName":"Bar"
}

С использованием . вы можете получить доступ только через

console.info(person.firstName); // returns Foo

Используя [] вы можете получить доступ к значению с помощью переменной

let couldChange = 'Name';
console.info(person['first'+couldChange]); // returns foo
console.info(person['last'+couldChange]); // returns bar

Большую часть времени вы будете использовать запись через точку. Если вам не нужно свойство объекта, к которому вам нужно получить доступ, чтобы быть динамическим. Это связано с тем, что значение, которое вы передаете в скобки, может быть переменной, если оно разрешается в строку. Проверьте эту ссылку для получения дополнительной информации:

https://codeburst.io/javascript-quickie-dot-notation-vs-bracket-notation-333641c0f781

В большинстве случаев разницы нет, см. Средства доступа к свойствам (MDN), но вы не можете использовать запись через точку, если имя свойства не является допустимым именем идентификатора, например. когда его представление не является строкой или когда вам нужно использовать переменную для имени свойства.

obj[1]   // is valid
obj["1"] // is the same
obj.1    // is NOT valid

const propertyName = 1;
obj[propertyName] // the same as obj[1]
obj.propertyName  // not same

Использование квадратных скобок может позволить вам использовать значение переменной для доступа к свойствам объекта, тогда как запись через точку — нет. Например:

var propName = 'age';

var o = {
  name: 'Tom',
  age: '29',
  about: 'He\'s a cool guy!'
};

console.info(o.propName); //  <-- Will be undefined
console.info(o[propName]); // <-- Bingo

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