▸1. Що таке JavaScript?
JavaScript — це мова програмування, яка робить веб-сторінки інтерактивними.
- Працює в браузері та на сервері (Node.js)
- Може змінювати DOM (структуру сторінки)
- Дозволяє обробляти події (клік, натискання клавіш тощо)
// приклад
document.body.style.background = "lightblue"; // змінює фон сторінки
▸2. Як підключити JavaScript до HTML?
Є кілька способів:
- Всередині HTML:
<script>
alert("Привіт!");
</script>
- Зовнішній файл:
<script src="app.js"></script>
Щоб не блокувати завантаження сторінки, часто додають defer
:
<script src="app.js" defer></script>
▸3. Що таке змінна в JavaScript?
Змінна — це контейнер для збереження значення.
let name = "Оля";
const age = 20;
var city = "Київ";
Можна змінювати let
і var
, але const
— ні.
▸4. У чому різниця між let, const і var?
let
— блочна область, можна змінювати значення.const
— блочна область, не можна перевизначати.var
— функціональна область, застарілий спосіб.
if (true) {
let x = 10;
var y = 20;
}
console.log(typeof x); // undefined
console.log(y); // 20
▸5. Які основні типи даних у JS?
Є примітиви та об’єкти.
-
Примітиви:
string
,number
,boolean
,null
,undefined
,symbol
,bigint
. - Об’єкти:
{}
,[]
,function(){}
.
let str = "Привіт"; // string
let num = 42; // number
let flag = true; // boolean
let arr = [1, 2, 3]; // object
▸6. Як перевірити тип змінної?
Основний спосіб — оператор typeof
.
typeof "abc" // "string"
typeof 123 // "number"
typeof [] // "object"
Для масивів краще:
Array.isArray([1,2,3]); // true
▸7. Що таке оператори?
Оператори виконують дії над значеннями:
- Арифметичні:
+
,-
,*
,/
,%
- Порівняння:
==
,===
,!=
,>
- Логічні:
&&
,||
,!
let a = 5, b = 10;
console.log(a + b); // 15
console.log(a > b); // false
console.log(a < b && b > 0); // true
▸8. У чому різниця між == і ===?
==
— порівнює значення з приведенням типів.===
— суворе порівняння (тип + значення).
console.log(5 == "5"); // true
console.log(5 === "5"); // false
▸9. Як працюють умовні оператори?
В JS є кілька способів виконати код залежно від умови:
let age = 18;
if (age >= 18) {
console.log("Дорослий");
} else {
console.log("Дитина");
}
switch (age) {
case 18: console.log("Повноліття!"); break;
default: console.log("Інший вік");
}
let status = (age >= 18) ? "Adult" : "Child";
▸10. Які є цикли в JS?
for
,while
,do...while
for...of
— значенняfor...in
— ключі
for (let i=0; i< 3; i++) {
console.log(i); // 0,1,2
}
let arr = ["a","b"];
for (let el of arr) console.log(el); // a, b
▸11. Що таке функція?
Функція — це блок коду, який можна викликати багато разів.
function greet(name) {
return "Привіт, " + name;
}
console.log(greet("Оля")); // Привіт, Оля
▸12. Які є види функцій?
// оголошення
function add(a, b) { return a+b; }
// функціональний вираз
const sum = function(a, b) { return a+b; };
// стрілкова
const mult = (a, b) => a*b;
▸13. Що таке параметри за замовчуванням?
Якщо значення не передано — використовується стандартне.
function greet(name = "Гість") {
console.log("Привіт, " + name);
}
greet(); // Привіт, Гість
greet("Іра"); // Привіт, Іра
▸14. Що таке область видимості?
Scope визначає, де можна використовувати змінні:
- Глобальна
- Функціональна
- Блочна
let x = 10; // глобальна
function test() {
let y = 20; // функціональна
if (true) {
let z = 30; // блочна
}
}
▸15. Що таке hoisting?
JS «піднімає» оголошення змінних і функцій нагору області.
console.log(a); // undefined
var a = 5;
foo(); // працює
function foo() { console.log("ok"); }
let
і const
піднімаються, але не ініціалізуються → Temporal Dead Zone.
▸16. Що таке замикання?
Замикання — це функція, яка пам’ятає змінні з оточення, навіть після завершення зовнішньої функції.
function outer() {
let count = 0;
return function() {
count++;
return count;
}
}
let counter = outer();
console.log(counter()); // 1
console.log(counter()); // 2
▸17. Що таке стрілкові функції?
Вони коротші та не мають власного this
.
const square = x => x * x;
console.log(square(4)); // 16
Зручно використовувати в map
, filter
, reduce
.
▸18. Що таке оператор typeof?
Визначає тип значення:
typeof "Привіт" // string
typeof 42 // number
typeof null // object (історична помилка)
▸19. Що таке NaN?
NaN
означає "Not a Number".
let result = 0 / 0;
console.log(result); // NaN
console.log(typeof NaN); // number
Перевірка: Number.isNaN(value)
.
▸20. Що таке шаблонні рядки?
Це рядки в зворотних лапках (``), які підтримують інтерполяцію.
let name = "Андрій";
console.log(`Привіт, ${name}!`); // Привіт, Андрій!
▸21. Що таке масив у JavaScript?
Масив — це впорядкований список значень.
let fruits = ["яблуко", "банан", "вишня"];
console.log(fruits[1]); // банан
Масив може містити різні типи значень, навіть інші масиви чи об’єкти.
▸22. Як отримати доступ до елементів масиву?
let arr = [10, 20, 30];
console.log(arr[0]); // 10
arr[1] = 25;
console.log(arr); // [10, 25, 30]
Якщо індекса немає → undefined
.
▸23. Які основні методи масивів?
Часто використовують:
let arr = [1, 2, 3, 4];
arr.push(5); // [1,2,3,4,5]
arr.pop(); // [1,2,3,4]
arr.shift(); // [2,3,4]
arr.unshift(0); // [0,2,3,4]
let doubled = arr.map(x => x*2); // [0,4,6,8]
let even = arr.filter(x => x%2===0); // [0,2,4]
▸24. Чим відрізняється for...of від for...in?
for...of
ітерує значення, for...in
— ключі.
let arr = ["a","b","c"];
for (let val of arr) console.log(val); // a,b,c
for (let i in arr) console.log(i); // 0,1,2
▸25. Що таке об’єкт у JavaScript?
Об’єкт — набір пар "ключ: значення".
let user = {
name: "Оля",
age: 25,
isAdmin: true
};
console.log(user.name); // Оля
▸26. Як звернутися до властивостей об’єкта?
let car = {brand: "BMW", year: 2020};
console.log(car.brand); // BMW
console.log(car["year"]); // 2020
Квадратні дужки зручні, якщо ключ — змінна.
▸27. Як перебирати об’єкти?
let user = {name: "Іра", age: 20};
for (let key in user) {
console.log(key, user[key]);
}
Або сучасні методи:
Object.keys(user); // ["name","age"]
Object.values(user); // ["Іра",20]
Object.entries(user);// [["name","Іра"],["age",20]]
▸28. Що таке this у JavaScript?
this
вказує на контекст виконання.
let user = {
name: "Оля",
sayHi() {
console.log("Привіт, " + this.name);
}
};
user.sayHi(); // Привіт, Оля
В стрілкових функціях this
не прив’язується.
▸29. Як прив’язати this?
Можна використати bind
, call
або apply
.
function greet() { console.log(this.name); }
let user = {name:"Іра"};
let bound = greet.bind(user);
bound(); // Іра
▸30. Що таке JSON?
JSON (JavaScript Object Notation) — текстовий формат для обміну даними.
let user = {name:"Оля", age:25};
let json = JSON.stringify(user);
console.log(json); // '{"name":"Оля","age":25}'
let obj = JSON.parse(json);
console.log(obj.name); // Оля
▸31. Що таке деструктуризація?
Це зручний спосіб отримати значення з об’єкта чи масиву.
let arr = [1,2];
let [a,b] = arr; // a=1, b=2
let user = {name:"Оля", age:20};
let {name, age} = user; // name="Оля", age=20
▸32. Що таке оператор spread (...)?
Розгортає масив або об’єкт.
let arr = [1,2,3];
let newArr = [...arr, 4, 5]; // [1,2,3,4,5]
let obj = {a:1};
let copy = {...obj, b:2}; // {a:1, b:2}
▸33. Що таке rest (...)?
Збирає залишок у масив.
function sum(...nums) {
return nums.reduce((a,b)=>a+b);
}
console.log(sum(1,2,3)); // 6
▸34. Як скопіювати масив чи об’єкт?
let arr = [1,2,3];
let copyArr = [...arr];
let obj = {a:1};
let copyObj = {...obj};
Але це поверхнева копія. Для глибокої — structuredClone()
або JSON.parse(JSON.stringify())
.
▸35. Що таке метод map()?
Створює новий масив, застосовуючи функцію до кожного елемента.
let nums = [1,2,3];
let doubled = nums.map(n => n*2);
console.log(doubled); // [2,4,6]
▸36. Що таке filter()?
Фільтрує елементи за умовою.
let nums = [1,2,3,4];
let even = nums.filter(n => n%2===0);
console.log(even); // [2,4]
▸37. Що таке reduce()?
Агрегує значення в одне.
let nums = [1,2,3];
let sum = nums.reduce((acc,n)=>acc+n, 0);
console.log(sum); // 6
▸38. Що таке find() і some()/every()?
let arr = [1,2,3,4];
arr.find(n => n>2); // 3
arr.some(n => n>3); // true
arr.every(n => n>0); // true
▸39. Як об’єднати масиви?
let a = [1,2];
let b = [3,4];
let merged = [...a, ...b]; // [1,2,3,4]
let concat = a.concat(b); // [1,2,3,4]
▸40. Як відсортувати масив?
За замовчуванням сортує як рядки.
let nums = [10, 2, 5];
nums.sort(); // [10,2,5] → ["10","2","5"]
nums.sort((a,b)=>a-b); // [2,5,10]
▸41. Що таке синхронний і асинхронний код?
Синхронний код виконується по черзі, рядок за рядком. Асинхронний дозволяє виконувати інші задачі, поки чекаємо результат (наприклад, відповідь сервера).
// синхронний
console.log("1");
console.log("2");
// асинхронний
console.log("1");
setTimeout(()=>console.log("2"), 1000);
console.log("3");
// результат: 1, 3, 2
▸42. Що таке callback?
Callback — це функція, передана іншій функції як аргумент і викликана пізніше.
function greet(name, callback) {
console.log("Привіт, " + name);
callback();
}
greet("Оля", () => console.log("Як справи?"));
// Привіт, Оля
// Як справи?
▸43. У чому проблема callback hell?
Якщо є багато вкладених callback-ів, код стає важким для читання та підтримки.
getUser(1, user => {
getPosts(user.id, posts => {
getComments(posts[0].id, comments => {
console.log(comments);
});
});
});
Вирішення → Promise або async/await.
▸44. Що таке Promise?
Promise — це об’єкт, який представляє результат асинхронної операції: виконаний (resolved
) або з помилкою (rejected
).
let promise = new Promise((resolve, reject) => {
setTimeout(() => resolve("Готово!"), 1000);
});
promise.then(result => console.log(result));
// Готово!
▸45. Які стани має Promise?
pending
— очікуванняfulfilled
— успіхrejected
— помилка
let p = Promise.resolve(123);
p.then(val => console.log(val)); // 123
▸46. Як обробити помилки в Promise?
let p = new Promise((res, rej) => rej("Помилка"));
p.then(val => console.log(val))
.catch(err => console.log("Сталася помилка:", err))
.finally(() => console.log("Завжди виконається"));
▸47. Що таке Promise.all()?
Виконує кілька промісів паралельно. Якщо один завершується з помилкою → весь ланцюг rejected
.
Promise.all([
Promise.resolve(1),
Promise.resolve(2),
Promise.resolve(3)
]).then(values => console.log(values)); // [1,2,3]
▸48. Що таке Promise.race()?
Повертає результат першого виконаного проміса.
Promise.race([
new Promise(res => setTimeout(()=>res("A"), 1000)),
new Promise(res => setTimeout(()=>res("B"), 500))
]).then(val => console.log(val)); // B
▸49. Що таке async/await?
Синтаксичний цукор над Promise, що робить асинхронний код більш схожим на синхронний.
async function fetchData() {
let res = await fetch("https://jsonplaceholder.typicode.com/todos/1");
let data = await res.json();
console.log(data);
}
fetchData();
▸50. Як обробити помилки з async/await?
async function getData() {
try {
let res = await fetch("wrong_url");
let data = await res.json();
} catch (err) {
console.log("Помилка:", err.message);
}
}
▸51. Що таке setTimeout і setInterval?
Це функції браузера для запуску коду з затримкою або регулярно.
setTimeout(()=>console.log("1 раз"), 1000);
let id = setInterval(()=>console.log("кожні 2с"), 2000);
clearInterval(id);
▸52. Що таке Event Loop?
Event Loop — механізм, який керує виконанням асинхронного коду в JS.
console.log("A");
setTimeout(()=>console.log("B"), 0);
console.log("C");
// порядок: A, C, B
▸53. Що таке мікрозадачі й макрозадачі?
Макрозадачі: setTimeout, setInterval, I/O. Мікрозадачі: Promise, queueMicrotask.
setTimeout(()=>console.log("timeout"));
Promise.resolve().then(()=>console.log("promise"));
// результат: promise, timeout
▸54. Що таке генератори?
Це функції, які можна "призупиняти" та "відновлювати". Повертають об’єкт-ітератор.
function* gen() {
yield 1;
yield 2;
return 3;
}
let g = gen();
console.log(g.next()); // {value:1, done:false}
console.log(g.next()); // {value:2, done:false}
console.log(g.next()); // {value:3, done:true}
▸55. Як зупинити асинхронний процес?
Для fetch існує AbortController
.
let controller = new AbortController();
fetch("https://api", {signal: controller.signal});
controller.abort();
▸56. Чим відрізняється синхронний for від for await...of?
async function* gen() {
yield Promise.resolve(1);
yield Promise.resolve(2);
}
(async ()=>{
for await (let val of gen()) {
console.log(val); // 1, 2
}
})();
for await...of
зручно для асинхронних ітерацій.
▸57. Як створити власний Promise?
function delay(ms) {
return new Promise(res => setTimeout(res, ms));
}
delay(1000).then(()=>console.log("Через 1с"));
// Через 1с
▸58. Що таке async iterator?
Це ітератор, метод next()
якого повертає Promise.
let asyncIterable = {
async *[Symbol.asyncIterator]() {
yield "A";
yield "B";
}
};
(async ()=>{
for await (let v of asyncIterable) {
console.log(v); // A, B
}
})();
▸59. Що таке queueMicrotask?
Додає завдання у чергу мікрозадач.
queueMicrotask(()=>console.log("Мікрозадача"));
console.log("Звичайний код");
// порядок: Звичайний код, Мікрозадача
▸60. Як паралельно виконати кілька асинхронних функцій?
async function getA() {
return "A";
}
async function getB() {
return "B";
}
async function main() {
let [a,b] = await Promise.all([getA(), getB()]);
console.log(a,b); // A B
}
main();
▸61. Що таке DOM?
DOM (Document Object Model) — це об’єктне представлення HTML-документа. Завдяки DOM JavaScript може змінювати елементи, стилі та структуру сторінки.
document.title; // Отримати заголовок сторінки
document.body.style.background = "lightblue";
▸62. Як отримати елемент з DOM?
Основні методи:
document.getElementById("id");
document.getElementsByClassName("class");
document.getElementsByTagName("div");
document.querySelector(".class"); // перший
document.querySelectorAll("p"); // всі
▸63. Як змінити текст або HTML елемента?
let el = document.getElementById("demo");
el.textContent = "Новий текст";
el.innerHTML = "<b>Жирний текст</b>";
▸64. Як змінити атрибути елемента?
let img = document.querySelector("img");
img.setAttribute("alt", "Фото");
console.log(img.getAttribute("src"));
img.removeAttribute("width");
▸65. Як створити і додати новий елемент?
let div = document.createElement("div");
div.textContent = "Привіт!";
document.body.appendChild(div);
Або:
document.body.insertAdjacentHTML("beforeend", "<p>Hello</p>");
▸66. Як видалити елемент з DOM?
let el = document.querySelector("#demo");
el.remove();
Або через батьківський елемент:
el.parentNode.removeChild(el);
▸67. Що таке події в JS?
Подія — це дія користувача або браузера (клік, клавіша, завантаження).
let btn = document.querySelector("button");
btn.addEventListener("click", () => alert("Клік!"));
▸68. У чому різниця між onclick і addEventListener?
onclick
замінює обробник, а addEventListener
дозволяє додавати кілька.
btn.onclick = () => console.log("1");
btn.onclick = () => console.log("2"); // перезаписує
btn.addEventListener("click", ()=>console.log("1"));
btn.addEventListener("click", ()=>console.log("2")); // обидва спрацюють
▸69. Що таке об’єкт події?
Коли виконується обробник, передається об’єкт події з інформацією.
btn.addEventListener("click", (event)=>{
console.log(event.type); // click
console.log(event.target); // сам елемент
});
▸70. Що таке делегування подій?
Обробник ставиться на батьківський елемент, а події ловляться через event.target
.
document.getElementById("list")
.addEventListener("click", e=>{
if(e.target.tagName==="LI"){
console.log("Клік по", e.target.textContent);
}
});
▸71. Як працює localStorage?
Це сховище браузера для ключ-значення (рядки), зберігається навіть після перезавантаження.
localStorage.setItem("name","Оля");
console.log(localStorage.getItem("name")); // Оля
localStorage.removeItem("name");
localStorage.clear();
▸72. У чому різниця між localStorage і sessionStorage?
localStorage
— зберігає дані безстроково.sessionStorage
— зберігає лише на час сесії (закриєш вкладку — видаляється).
▸73. Як працює fetch API?
fetch()
використовується для HTTP-запитів.
fetch("https://jsonplaceholder.typicode.com/posts/1")
.then(res => res.json())
.then(data => console.log(data));
▸74. Як відправити POST-запит через fetch?
fetch("https://jsonplaceholder.typicode.com/posts", {
method: "POST",
headers: {"Content-Type":"application/json"},
body: JSON.stringify({title:"Привіт", body:"Текст"})
})
.then(res => res.json())
.then(data => console.log(data));
▸75. Як працювати з формами в JS?
let form = document.querySelector("form");
form.addEventListener("submit", e=>{
e.preventDefault(); // відміняє перезавантаження
let data = new FormData(form);
console.log(data.get("username"));
});
▸76. Що таке події input і change?
input
— спрацьовує при кожній зміні. change
— коли елемент втратив фокус.
let inp = document.querySelector("input");
inp.addEventListener("input", ()=>console.log("Змінюється"));
inp.addEventListener("change", ()=>console.log("Закінчено"));
▸77. Як зберегти дані у cookies?
document.cookie = "user=Olya; path=/; max-age=3600"; // 1 година
console.log(document.cookie);
Для зручності зазвичай використовують бібліотеки (наприклад, js-cookie).
▸78. Як працювати з таймерами requestAnimationFrame?
Це метод для плавних анімацій у браузері.
function animate() {
console.log("Кадр");
requestAnimationFrame(animate);
}
requestAnimationFrame(animate);
▸79. Як відслідковувати події клавіатури?
document.addEventListener("keydown", e=>{
console.log("Натиснуто:", e.key);
});
document.addEventListener("keyup", e=>{
console.log("Відпущено:", e.key);
});
▸80. Як визначити координати кліка на сторінці?
document.addEventListener("click", e=>{
console.log("X:", e.clientX, "Y:", e.clientY);
});
clientX/Y
— відносно вікна, pageX/Y
— відносно всієї сторінки.
▸81. Що таке ES6?
ES6 (ECMAScript 2015) — це велике оновлення JavaScript, яке додало:
- let/const
- стрілкові функції
- класи
- шаблонні рядки
- деструктуризацію
- Promise
- модулі
▸82. Як працюють шаблонні рядки?
Використовуються бектики `
і дозволяють вставляти змінні через ${}
.
let name = "Оля";
console.log(`Привіт, ${name}!`); // Привіт, Оля!
▸83. Що таке стрілкові функції?
Коротший синтаксис функцій. Не мають власного this
та arguments
.
let add = (a,b) => a+b;
console.log(add(2,3)); // 5
▸84. Як працює деструктуризація?
let [a,b] = [1,2];
console.log(a,b); // 1 2
let {name, age} = {name:"Іра", age:22};
console.log(name, age); // Іра 22
▸85. Що таке spread і rest оператори?
// spread (...)
let arr = [1,2,3];
let arr2 = [...arr, 4,5];
console.log(arr2); // [1,2,3,4,5]
// rest (...)
function sum(...nums) {
return nums.reduce((a,b)=>a+b,0);
}
console.log(sum(1,2,3)); // 6
▸86. Що таке клас у JS?
Синтаксичний цукор над прототипами.
class Person {
constructor(name) {
this.name = name;
}
greet() {
console.log("Привіт, я " + this.name);
}
}
let p = new Person("Олег");
p.greet();
▸87. Як реалізується наслідування класів?
class Animal {
speak() { console.log("Звук"); }
}
class Dog extends Animal {
speak() { console.log("Гав!"); }
}
new Dog().speak(); // Гав!
▸88. Що таке модулі в JS?
Дозволяють імпортувати/експортувати змінні та функції між файлами.
// math.js
export function add(a,b){ return a+b; }
// main.js
import {add} from "./math.js";
console.log(add(2,3));
▸89. У чому різниця між default і named export?
// default export
export default function greet(){ console.log("Hi"); }
import greet from "./file.js";
// named export
export function sum(a,b){ return a+b; }
import {sum} from "./file.js";
▸90. Що таке Proxy?
Proxy дозволяє перехоплювати операції з об’єктом.
let obj = {name:"Іра"};
let proxy = new Proxy(obj, {
get(target, prop) {
return prop in target ? target[prop] : "Немає!";
}
});
console.log(proxy.name); // Іра
console.log(proxy.age); // Немає!
▸91. Що таке Map і Set?
- Map — зберігає пари ключ-значення (будь-який тип ключа).
- Set — колекція унікальних значень.
let map = new Map();
map.set("a",1);
console.log(map.get("a"));
let set = new Set([1,2,2,3]);
console.log(set); // {1,2,3}
▸92. Що таке WeakMap і WeakSet?
Вони зберігають лише об’єкти як ключі/значення і не заважають garbage collection.
let weakMap = new WeakMap();
let obj = {};
weakMap.set(obj, "дані");
console.log(weakMap.get(obj));
▸93. Що таке Symbol?
Унікальний і незмінний тип даних, часто для прихованих властивостей.
let id = Symbol("id");
let user = {name:"Іра", [id]:123};
console.log(user); // {name:"Іра", Symbol(id):123}
▸94. Як працюють Generators у сучасному JS?
Генератори дозволяють керувати потоком виконання асинхронно або поетапно.
function* idGen() {
let id=1;
while(true) yield id++;
}
let gen = idGen();
console.log(gen.next().value); // 1
console.log(gen.next().value); // 2
▸95. Що таке async generators?
async function* gen() {
yield "A";
yield "B";
}
(async ()=>{
for await(let v of gen()){
console.log(v);
}
})();
▸96. Що таке модульні патерни у JS?
Модульний патерн дозволяє інкапсулювати код і уникати глобальних змінних.
let Module = (function(){
let secret = "приватне";
return {
getSecret: () => secret
};
})();
console.log(Module.getSecret());
▸97. Що таке Singleton у JS?
Патерн, який гарантує існування лише одного екземпляра.
class Singleton {
constructor(){
if(Singleton.instance) return Singleton.instance;
Singleton.instance = this;
}
}
let a = new Singleton();
let b = new Singleton();
console.log(a===b); // true
▸98. Бандл у JS
Бандл (bundle) — це об'єднаний файл, що містить весь JS-код, модулі, бібліотеки та ресурси проєкту, готовий для браузера.
- Сумісність із браузерами: сучасний код перетворюється у старіший формат.
- Менше запитів: один або кілька файлів замість сотень маленьких.
- Оптимізація: мінімізація, tree shaking, code splitting.
- Зручність розробки: модульний код працює як єдиний застосунок.
Приклад:
// math.js
export function add(a, b) { return a + b; }
// app.js
import { add } from './math.js';
console.log(add(2, 3));
// після бандлу (bundle.js) можна підключити в HTML:
<script src="bundle.js"></script>
▸99. Що таке lazy loading?
Відкладене завантаження ресурсів, коли вони реально потрібні (зображення, модулі).
// динамічний імпорт
import("./math.js").then(module=>{
console.log(module.add(2,3));
});
▸100. Як оптимізувати роботу JS у браузері?
- мінімізувати доступ до DOM
- використовувати дебаунс/тротлінг для подій
- дробити великі задачі через
setTimeout
/requestIdleCallback
- використовувати кешування даних
- lazy loading для ресурсів