Операторы назначения

Операторы назначения предназначены чтобы изменять значения переменных.

tip

Мой совет - в дальнейшем воспринимать переменные как указатели на те или иные объекты(что в действительности и происходит). А оператор присваивания в свою очередь меняет указать на какой-то другой объект.

Простое присваивание =

var x = 1; // присвоить переменной "x" число 1
x = 3; // меняем значение переменной.

Что произойдет в примере выше?

  • var x = 1
    • Интерпретатор увидет числовой литерал, выделит память под число. (если это требуется).
    • После чего в текущей области видимости появится новое имя(переменная) указывающая на новое значение в памяти.
  • x = 3
    • Интерпретатор создаст число в памяти.
    • Переставит указатель в переменной на новое значение.

Это не полный список операторов присваивания, за справкой можно сходить сюда:

Присваивание с арифметической операцией =<*>

note

Почти всегда когда вы видите <> в документации или справке - это обозначает плейсхолдер, в который что-то подставляется.

Например

git <cmd>

👆 Такая запись говорит нам, что нам надо подставить cmd(аргумент) в команду.

Перед нами стоит задача умножить значение переменной a на 2, мы можем сделать это так:

var a = 1;
a = a * 2;

Вроде бы неплохо, но есть более интересный вариант - воспользовать оператором назначения с арифметической операцией:

var a = 1;
a *= 2;

Операцию a *= 2 мы можем считать синтаксическим сахаром, такая запись развернется в a = a * 2. Такие операторы существуют для всех видов арифметических и бинарных операций. Чтобы долго не рассписывать это, давайте я просто напишу несколько примеров:

x = 3;
x += 1; // 4
x = 4;
x -= 1; // 3
x = 4;
x *= 2; // 8
x = 4;
x /= 2; // 2
x = 4;
x **= 2; // 16

Сторонние материалы

;

Присваивание с деструктуризацией

caution

Эти операторы в полной мере вы сможете понять после того как ознакомитесь с массивами и объектами.

Деструктуризация/Распаковка

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

Присваивание с деструктуризацией позволяет нам распаковать объект или массив сразу в переменные.

Распаковка из массива

Вот простенький пример распаковки массива с двумя значениями в переменный a и b:

const [a, b] = [1, 2];
console.log(a, b); // 1, 2

Если значений в массиве больше чем переменных, то оставшиеся значения в массиве будут просто проигнорированны.

// x, y, z - пердставим, что это координаты в 3х мерном пространстве
const [x, y] = [20, 30, 20]; // координату z мы просто не распаковываем в переменную

А что делать если мы хотим вытащить координаты x и z? Тогда мы можем не указывать название для переменной в которой была бы координата y:

// 👇 - обязательно обратите внимение на дополнительную запятую
const [x, , z] = [20, 30, 20]; // координату y мы просто не распаковываем в переменную

Использование rest-оператора

Этот оператор предназначен чтобы упаковать оставшиеся значения при распаковке из массива или объекта в отдельные переменные. Чем читать определение легче просто посмотреть на пример:

const [first_name, last_name, position, ...rest] = [
"John",
"Dow",
"CTO",
"5 year",
"35 years old",
];
console.log(first_name, last_name, position); // 'John', 'Dow', 'CTO'
console.log(rest); // ['5 years', '35 years old']

Как видите, оставшиеся значения из массива мы переупаковали в переменную rest, для этого воспользовавшись rest-оператором(...<>).

info

Сразу должен сделать оговорку(хоть мы еще и не говорили про распаковку объектов) о том, что rest-оператор упаковывает оставшиеся значения из объектов и массивов в соответствуйющие типы.

Деструктуризация сложного массива

Вы можете распаковывать не только плоские массивы, но и вложенные.

const [[x, y, ...rest], b, c] = [[1, 2, 5, 6], 3, 4];
console.log(x); // 1
console.log(y); // 2
console.log(b); // 3
console.log(c); // 4
console.log(rest); // [5, 6]

Распаковка объекта

danger

TODO: Дописать

Смешанная распаковка

Распаковывать вы можете не только массивы или объекты, но и смешанные данные. Например у нас есть следующий объект:

const planet = {
name: "Mars",
terraformation_status: "READY",
coordinates: [23.901284, 75.123],
};

Мы хотим вытащить из этого объекта толко статус терраформирования и координаты, сделаем мы это так:

const {
terraformation_status: status, // здесь мы говорим, что значение по ключу 'terraformation_status' будет "отправленно" в переменную 'status'
coordinates: [x, y],
} = planet;
console.log(status); // 'READY'
console.log(x, y); // 23.901284, 75.1230
caution

Будьте внимательны со скобками!

Сторонние материалы