Базовый CS с нуля
Объекты как ключ-значение
Массив — правильная форма, когда твои значения образуют последовательность — позиция 0, позиция 1, позиция 2 — и сами позиции не несут смысла, кроме порядка. Но многие данные, с которыми работает программа, не такие. У пользователя есть имя, возраст, email. Это не «элемент 0, элемент 1, элемент 2». У каждого есть смысл, и этот смысл — слово, а не число.
Для данных вроде этих языки дают тебе объект: значение, составленное из именованных
полей. Вместо того чтобы достигать значения, считая позиции, ты достигаешь его по имени.
user.age прямо говорит «поле age объекта user».
Этот урок показывает, что такое объект в памяти — набор именованных слотов — и трассирует, как программа достигает поля по его имени. Ты уже понимаешь массив; объект — его двойник, и видеть их рядом делает оба яснее.
После этого урока ты сможешь определить объект как набор пар ключ-значение, объяснить, что такое поле, ключ и значение, трассировать, как программа читает поле по его имени, и сформулировать ключевое различие между массивом и объектом — позиционный индекс против именованного ключа.
Объект — это набор именованных полей. Вспомни из Блока 06, что переменная — это именованная ячейка: имя, привязанное к слоту в памяти, хранящему значение. Объект берёт эту идею и связывает много именованных ячеек вместе под одним значением.
Объект составлен из полей (также называемых свойствами). У каждого поля две части:
- Ключ — имя поля, записанное как слово, вроде
nameилиage. - Значение — данные, хранимые в этом поле, вроде
"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 } описывают один и тот
же объект: один и тот же набор пар ключ-значение. Ты никогда не достигаешь поля по тому,
«которое идёт первым», — ты достигаешь его по ключу. Если порядок элементов важен для
твоей программы, это сигнал, что тебе нужен массив, а не объект.
У объекта { 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 } — один и тот же объект. Используй массив для упорядоченной
последовательности значений одного вида; используй объект для именованного набора частей
с разными смыслами.