Перевірка знань по темі "JavaScript"

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 для ресурсів