JS Tower
JavaScript & TypeScriptПодготовка к собеседованию

Практические задачи

Типичные задачи на собеседованиях

Цель урока

Разбор практических задач, которые дают на собеседованиях.


Debounce

Задача: Реализуй функцию debounce.

function debounce(fn, delay) {
  let timeoutId;
  
  return function(...args) {
    clearTimeout(timeoutId);
    timeoutId = setTimeout(() => {
      fn.apply(this, args);
    }, delay);
  };
}

// Использование
const search = debounce((query) => {
  console.log("Поиск:", query);
}, 300);
Loading...
Ваш вывод:

Throttle

Задача: Реализуй функцию throttle.

function throttle(fn, delay) {
  let lastTime = 0;
  
  return function(...args) {
    const now = Date.now();
    if (now - lastTime >= delay) {
      lastTime = now;
      fn.apply(this, args);
    }
  };
}

Deep Clone

Задача: Реализуй глубокое копирование объекта.

function deepClone(obj) {
  if (obj === null || typeof obj !== "object") {
    return obj;
  }
  
  if (Array.isArray(obj)) {
    return obj.map(item => deepClone(item));
  }
  
  const clone = {};
  for (const key in obj) {
    if (obj.hasOwnProperty(key)) {
      clone[key] = deepClone(obj[key]);
    }
  }
  return clone;
}
Запустите код для проверки
Loading...
Ваш вывод:
Ожидаемый результат:
true

Flatten Array

Задача: Разверни вложенный массив.

function flatten(arr) {
  const result = [];
  
  function flattenHelper(arr) {
    for (const item of arr) {
      if (Array.isArray(item)) {
        flattenHelper(item);
      } else {
        result.push(item);
      }
    }
  }
  
  flattenHelper(arr);
  return result;
}

// Или с reduce
function flatten(arr) {
  return arr.reduce((acc, item) => {
    return acc.concat(Array.isArray(item) ? flatten(item) : item);
  }, []);
}
Запустите код для проверки
Loading...
Ваш вывод:
Ожидаемый результат:
[1,2,3,4,5,6]

Curry

Задача: Реализуй каррирование.

function curry(fn) {
  return function curried(...args) {
    if (args.length >= fn.length) {
      return fn.apply(this, args);
    }
    return function(...args2) {
      return curried.apply(this, args.concat(args2));
    };
  };
}
Запустите код для проверки
Loading...
Ваш вывод:
Ожидаемый результат:
6
6
6

Memoize

Задача: Реализуй мемоизацию.

function memoize(fn) {
  const cache = new Map();
  
  return function(...args) {
    const key = JSON.stringify(args);
    
    if (cache.has(key)) {
      return cache.get(key);
    }
    
    const result = fn.apply(this, args);
    cache.set(key, result);
    return result;
  };
}

Promise.all

Задача: Реализуй Promise.all.

function promiseAll(promises) {
  return new Promise((resolve, reject) => {
    const results = [];
    let completed = 0;
    
    if (promises.length === 0) {
      resolve(results);
      return;
    }
    
    promises.forEach((promise, index) => {
      Promise.resolve(promise)
        .then(value => {
          results[index] = value;
          completed++;
          
          if (completed === promises.length) {
            resolve(results);
          }
        })
        .catch(reject);
    });
  });
}

Event Emitter

Задача: Реализуй простой Event Emitter.

class EventEmitter {
  constructor() {
    this.events = {};
  }
  
  on(event, callback) {
    if (!this.events[event]) {
      this.events[event] = [];
    }
    this.events[event].push(callback);
  }
  
  off(event, callback) {
    if (!this.events[event]) return;
    this.events[event] = this.events[event].filter(cb => cb !== callback);
  }
  
  emit(event, ...args) {
    if (!this.events[event]) return;
    this.events[event].forEach(callback => callback(...args));
  }
  
  once(event, callback) {
    const wrapper = (...args) => {
      callback(...args);
      this.off(event, wrapper);
    };
    this.on(event, wrapper);
  }
}

Bind

Задача: Реализуй Function.prototype.bind.

Function.prototype.myBind = function(context, ...args) {
  const fn = this;
  
  return function(...newArgs) {
    return fn.apply(context, [...args, ...newArgs]);
  };
};
Запустите код для проверки
Loading...
Ваш вывод:
Ожидаемый результат:
Привет, Иван!

Практикуйся

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