Irbisa · Шпаргалка

JavaScript для React

Замыкания, области видимости, this, прототипы, сравнение, event loop, промисы и async/await, модули, иммутабельность, методы массивов

Junior-разработчик · 21 вопрос

  1. 01

    Чем отличаются var, let и const и что такое temporal dead zone?

    var имеет область видимости функции, поднимается (hoisting) со значением undefined и допускает повторное объявление.

    function demo() {  console.log(a); // undefined: var is hoisted and initialized  // console.log(b); // ReferenceError: b is in the temporal dead zone  var a = 1;  let b = 2;…
  2. 02

    Чем отличаются == и === в JavaScript?

    === сравнивает без приведения типов: у значений должны совпадать и тип, и значение.

  3. 03

    Чем примитивные типы отличаются от ссылочных в JavaScript?

    Примитивы (string, number, bigint, boolean, undefined, null, symbol) представляют собой неизменяемые значения и копируются при присваивании.

  4. 04

    Чем null отличается от undefined?

    undefined означает, что значение никогда не присваивалось: неинициализированная переменная, отсутствующее свойство или аргумент, функция без return.

  5. 05

    Что такое замыкание и где замыкания встречаются в React?

    Замыкание (closure) представляет собой функцию вместе с переменными той области видимости, где она была создана.

    function createCounter() {  let count = 0; // captured by the closures below  return {    increment: () => ++count,    get: () => count,  };…
  6. 06

    Что выведет этот код и как сделать, чтобы он вывел 0, 1, 2?

    for (var i = 0; i < 3; i++) {  setTimeout(() => {    console.log(i);  }, 0);}

    Он трижды выведет 3.

  7. 07

    Что выведет этот код и почему объявление функции можно вызвать до его строки, а функциональное выражение нельзя?

    console.log(greet());console.log(typeof hello); function greet() {  return 'hi';} var hello = function () {  return 'hello';}; console.log(hello());console.log(wave()); var wave = () => 'wave';

    Код выведет hi, undefined и hello, затем бросит TypeError: wave is not a function.

  8. 08

    Что делают деструктуризация, spread и rest, optional chaining ?. и nullish coalescing ???

    Деструктуризация распаковывает объект или массив в переменные; spread ... разворачивает массив или объект в другой; rest ... собирает остаток; ?. даёт undefined вместо ошибки, если слева null или undefined; ?? подставляет запасное значение только для null и undefined.

    const settings = { volume: 0, theme: null, user: { name: 'Ada' } }; const { volume, theme = 'light', ...others } = settings;console.log(volume, theme); // 0 null: the default applies only to undefinedconsole.log(others); // { user: { name: 'Ada' } }…
  9. 09

    Какие методы массивов чаще всего используются в React-коде и какие из них мутируют массив?

    map, filter, find, some, every, reduce и slice возвращают новые значения и не трогают массив, что и нужно стейту в React.

    const cart = [  { id: 1, title: 'Book', price: 12 },  { id: 2, title: 'Pen', price: 2 },  { id: 3, title: 'Lamp', price: 30 },];…
  10. 10

    Чем поверхностная копия отличается от глубокой и как сделать каждую?

    Поверхностная копия создаёт новый объект верхнего уровня, но вложенные объекты делит с оригиналом; глубокая копия дублирует все уровни.

    const user = { name: 'Ada', address: { city: 'London' } }; const shallow = { ...user };shallow.address.city = 'Paris';console.log(user.address.city); // Paris: the nested object is shared…
  11. 11

    Как определяется this в JavaScript и чем отличаются стрелочные функции?

    У обычной функции this зависит от вызова: obj.method() даёт obj, call, apply и bind задают его явно, new даёт новый объект, а простой вызов в strict mode даёт undefined.

    const user = {  name: 'Ada',  greet() {    return `Hi, ${this.name}`;  },  greetLater() {…
  12. 12

    Как работает прототипное наследование и что к нему добавляет ключевое слово class?

    У каждого объекта есть скрытая ссылка на другой объект, его прототип.

    class Animal {  constructor(name) {    this.name = name;  }  speak() {    return `${this.name} makes a sound`;…
  13. 13

    Чем именованный экспорт отличается от экспорта по умолчанию и чем ES-модули отличаются от CommonJS?

    Именованных экспортов может быть сколько угодно, их импортируют по точному имени в фигурных скобках; экспорт по умолчанию один, и его импортируют под любым именем.

    // math.jsexport const PI = 3.14159;export function area(r) {  return PI * r * r;}export default function round(n) {…
  14. 14

    Что такое Promise и как с ним связаны async/await?

    Promise представляет собой объект для значения, которое появится позже: он начинается в pending и завершается один раз, fulfilled со значением или rejected с ошибкой.

    async function loadUser(id) {  try {    const response = await fetch(`/api/users/${id}`);    if (!response.ok) throw new Error(`HTTP ${response.status}`);    return await response.json();  } catch (error) {…
  15. 15

    В чём разница между Promise.all, Promise.allSettled, Promise.race и Promise.any и когда какой из них использовать?

    Все четыре принимают несколько промисов и возвращают один.

    const ok = (value, ms) => new Promise((resolve) => setTimeout(() => resolve(value), ms));const fail = (reason, ms) =>  new Promise((_, reject) => setTimeout(() => reject(new Error(reason)), ms)); const results = await Promise.allSettled([ok('profile', 50), fail('feed down', 10)]);console.log(results.map((r) => r.status)); // ['fulfilled', 'rejected']…
  16. 16

    Как обрабатывать ошибки в коде с async/await и что происходит с отклонённым промисом, который никто не поймал?

    Оборачивайте await в try/catch там, где с ошибкой можно что-то сделать, а в остальных местах пропускайте её выше: отказ поднимается через каждую функцию, которая ждёт промис, как брошенное исключение.

    async function loadDashboard(userId) {  showSpinner();  try {    // Promise.all attaches a handler to both requests at once    const [profile, orders] = await Promise.all([      fetchJson(`/api/users/${userId}`),…
  17. 17

    Как работает event loop в JavaScript: что такое стек вызовов, микрозадачи и макрозадачи?

    JavaScript выполняет код по одному фрагменту на стеке вызовов.

  18. 18

    В каком порядке этот код выведет значения и почему?

    console.log('1'); setTimeout(() => console.log('2'), 0); Promise.resolve().then(() => console.log('3')); (async () => {  console.log('4');  await null;  console.log('5');})(); console.log('6');

    Он выведет 1, 4, 6, 3, 5, 2.

  19. 19

    Найдите баг: saveAll выводит «done» раньше, чем сохранён хоть один пользователь.

    async function saveAll(users) {  users.forEach(async (user) => {    await saveUser(user);  });  console.log('done');}

    forEach игнорирует промисы, которые возвращает его колбэк, поэтому saveAll их не ждёт: сразу выводит done, а неудачное сохранение превращается в необработанный отказ (unhandled rejection) вместо ошибки, которую мог бы поймать вызывающий код.

  20. 20

    Как реализовать debounce и когда использовать его вместо throttle?

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

    function debounce(fn, delay) {  let timerId;  function debounced(...args) {    clearTimeout(timerId);    timerId = setTimeout(() => fn.apply(this, args), delay);  }…
  21. 21

    Что вызывает утечки памяти в одностраничном React-приложении и как их найти?

    Утечка означает память, которая остаётся достижимой, когда уже не нужна, и сборщик мусора не может её освободить.