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...
Ваш вывод:
Ожидаемый результат:
Привет, Иван!
Практикуйся
Эти задачи часто встречаются на собеседованиях. Попробуй решить каждую самостоятельно, не подглядывая в решение.