Коротка відповідь
middleЗмінні можна поміняти місцями за допомогою (1) тимчасової змінної, (2) деструктуризації масиву, або (3) арифметичної/логічної операції без тимчасової змінної. Наприклад, `let [a,b]=[b,a];` або `x^=y; y^=x; x^=y;`.
Повне пояснення
Що це і навіщо
Підмінка значень двох змінних потрібна, коли треба обміняти їх місцями без створення додаткових структур.
Принцип роботи / алгоритм
- Тимчасова змінна: зберігає одне значення, після чого обидва присвоюються.
- Деструктуризація: створює тимчасовий масив, який розпаковується назад.
- Арифметичні/логічні операції: використовують властивості операторів, щоб обмінятися без зовнішнього простору.
Реалізація (JS / TS)
// 1. Тимчасова змінна
let a = 5, b = 10;
const tmp = a; a = b; b = tmp;
// 2. Деструктуризація
[a, b] = [b, a];
// 3. XOR‑swap (числа)
x ^= y; y ^= x; x ^= y;
Тестування
test('swap with destructuring', () => {
let a = 1, b = 2;
[a, b] = [b, a];
expect(a).toBe(2);
expect(b).toBe(1);
});
Проблеми та edge cases
| Ситуація | Ризик | Як уникнути |
|---|---|---|
Обидва значення NaN | XOR‑swap не працює | Використовувати деструктуризацію |
Обидва значення 0 | XOR‑swap працює, але неочікувано | Перевірка типу |
Обидва значення BigInt | XOR‑swap не підтримує | Деструктуризація |
Обидва значення undefined | XOR‑swap не працює | Деструктуризація |
| Під час асинхронного коду | Змінні можуть бути змінені між рядками | Використовувати атомарну операцію (наприклад, деструктуризація) |
Оптимізація та продуктивність
Для простих чисел XOR‑swap може бути трохи швидшим, але сучасні JIT‑компілятори оптимізують деструктуризацію. У більшості випадків вибір не впливає на продуктивність.
Без JS / архітектурні альтернативи
У чистому HTML/CSS немає прямого способу обміняти значення змінних; це завжди логічна операція, що реалізується на стороні скрипту.
Cheatsheet + follow-up
- XOR‑swap:
x ^= y; y ^= x; x ^= y;(числа, без0). - Деструктуризація:
[a,b] = [b,a];(будь‑які типи). - Питання на інтерв’ю: «Які недоліки має XOR‑swap?»; «Як обмінятися значеннями у функції без глобальних змінних?».