awesome-everything EN
↑ Обратно к восхождению

Базовый CS с нуля

Объекты как ключ-значение

Суть Объект — это набор именованных полей: каждый ключ называет слот, хранящий значение. Где массив достигает элемента по числовой позиции, объект достигает значения по его имени.
◷ 20 min

Массив — правильная форма, когда твои значения образуют последовательность — позиция 0, позиция 1, позиция 2 — и сами позиции не несут смысла, кроме порядка. Но многие данные, с которыми работает программа, не такие. У пользователя есть имя, возраст, email. Это не «элемент 0, элемент 1, элемент 2». У каждого есть смысл, и этот смысл — слово, а не число.

Для данных вроде этих языки дают тебе объект: значение, составленное из именованных полей. Вместо того чтобы достигать значения, считая позиции, ты достигаешь его по имени. user.age прямо говорит «поле age объекта user».

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

Цель

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

Идея

Объект — это набор именованных полей. Вспомни из Блока 06, что переменная — это именованная ячейка: имя, привязанное к слоту в памяти, хранящему значение. Объект берёт эту идею и связывает много именованных ячеек вместе под одним значением.

Объект составлен из полей (также называемых свойствами). У каждого поля две части:

  1. Ключ — имя поля, записанное как слово, вроде name или age.
  2. Значение — данные, хранимые в этом поле, вроде "Mara" или 30.

Ключ в паре со своим значением — это пара ключ-значение. Объект — это просто коллекция пар ключ-значение. Можно представить каждое поле как помеченный слот: метка — это ключ, а слот хранит значение. У объекта { name: "Mara", age: 30 } два поля — слот с меткой name, хранящий "Mara", и слот с меткой age, хранящий 30.

Достижение значения: имя, а не позиция. Чтобы прочитать поле, ты пишешь object.key — например user.age. Программа берёт ключ age, находит в объекте слот, несущий эту метку, и читает значение в нём. Ключ и есть адрес внутрь объекта.

Массив против объекта — ключевой контраст. Оба группируют несколько значений под одним именем. Различие — в том, как ты достигаешь значения внутри:

  • Массив достигает значения по позиции: arr[2] означает «элемент с индексом 2». Позиции — это числа, и их порядок — это вся структура. (Вспомни: программа находит его, вычисляя адрес по индексу.)
  • Объект достигает значения по имени: obj.age означает «поле с меткой age». У полей словесные метки, и их порядок не имеет значения — { a: 1, b: 2 } и { b: 2, a: 1 } — это один и тот же объект.

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

Программа ниже строит объект с тремя полями и читает два из них по имени.

Код
1 // Объект-литерал: три именованных поля (пары ключ-значение).
2 let user = {
3 name: "Mara", // ключ "name" -> значение "Mara"
4 age: 30, // ключ "age" -> значение 30
5 active: true, // ключ "active" -> значение true
6 };
7
8 // Прочитать поле ПО ЕГО ИМЕНИ, а не по позиции:
9 let a = user.age; // найти слот с меткой "age", прочитать 30
10 let n = user.name; // найти слот с меткой "name", прочитать "Mara"
11
12 // Сравни с массивом, который достигается ПО ПОЗИЦИИ:
13 let nums = [10, 20, 30];
14 let x = nums[1]; // элемент с индексом 1 -> 20
  • L2 Объект: набор пар ключ-значение, сгруппированных под именем user
  • L3 Поле 1 — ключ 'name' помечает слот, хранящий значение 'Mara'
  • L4 Поле 2 — ключ 'age' помечает слот, хранящий значение 30
  • L9 user.age: найти слот, чья метка 'age', прочитать его значение (30)
  • L13 Массив достигает значений по числовой позиции, а не по имени
  • L14 nums[1]: позиция 1, вычисленная как смещение от базы — см. урок 02
Объект с тремя именованными полями. Чтение поля использует его ключ. Трассировка ниже показывает поиски по имени.
Пошаговый разбор

Пройди построение user и чтение двух полей шаг за шагом. Каждая ячейка — одно поле объекта; метка под каждой ячейкой — ключ этого поля.

1 let user = {
2 name: "Mara",
3 age: 30,
4 active: true,
5 };
6 let a = user.age;
7 let n = user.name;

Почему это работает

Почему использовать имена вместо позиций для данных такого рода? Числовые позиции несут смысл, только когда данные действительно последовательность. Для записи пользователя то, что позиция 0 — имя, а позиция 1 — возраст, было бы произвольным соглашением, которое пришлось бы запоминать и никогда не нарушать. Ключ самоописателен: user.age точно говорит, что он читает. Имена также освобождают данные от порядка — добавление нового поля не сдвигает остальные, в отличие от вставки элемента массива, которая сдвигает каждый последующий индекс. Именованные поля меняют тесную позиционную раскладку массива на ясность и гибкость.

Частая ошибка

Распространённая ошибка — думать, что у полей объекта есть значимый порядок, как у элементов массива. Это не так. { a: 1, b: 2 } и { b: 2, a: 1 } описывают один и тот же объект: один и тот же набор пар ключ-значение. Ты никогда не достигаешь поля по тому, «которое идёт первым», — ты достигаешь его по ключу. Если порядок элементов важен для твоей программы, это сигнал, что тебе нужен массив, а не объект.

Практика 0 / 5

У объекта { name: "Mara", age: 30, active: true } сколько полей (пар ключ-значение)?

let p = { x: 7, y: 4 }; Программа читает p.y. Какое значение она читает?

let item = { price: 50, qty: 3 }; Программа читает item.price. Какое значение она читает?

Объект достигается по имени; массив достигается по числовой позиции. Чтобы получить значение поля под названием 'score', используешь ли ты числовой индекс? Введи 1 за да, 0 за нет.

let a = { v: 1, w: 1 }; let b = { w: 1, v: 1 }; Поля — это одни и те же пары ключ-значение в другом записанном порядке. Описывают ли a и b один и тот же набор полей объекта? Введи 1 за да, 0 за нет.

Проверь себя
Викторина

Что такое объект и чем он отличается от массива?

Итог

Объект — это значение, составленное из полей (также называемых свойствами), где каждое поле — это пара ключ-значение: ключ — это имя поля, а значение — данные, хранимые под ним. Можно представить каждое поле как помеченный слот — ключ это метка, а слот хранит значение. Чтобы прочитать поле, ты используешь его ключ: user.age находит слот с меткой age и читает его значение. Ключевое отличие от массива: массив достигает значения по числовой позиции (arr[2]), а объект достигает значения по имени (obj.age). Поэтому у полей объекта нет значимого порядка — { a: 1, b: 2 } и { b: 2, a: 1 } — один и тот же объект. Используй массив для упорядоченной последовательности значений одного вида; используй объект для именованного набора частей с разными смыслами.

Продолжить восхождение ↑Коллекции в памяти
хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources3
expand
  1. 01
  2. 02
  3. 03

Trademarks belong to their respective owners. Editorial reference only.