Привет, ребята! Если вы стремитесь получить работу инженера-программиста или разработчика JavaScript, важно быть хорошо подготовленным к предстоящим техническим проблемам. Одним из популярных ресурсов, который может помочь вам отточить свои навыки кодирования, является Leetcode’s 30 Days of JavaScript. В этой программе вы отправитесь в месячное путешествие, выполняя упражнения по программированию, специально разработанные для повышения вашего уровня владения JavaScript, широко используемым языком программирования в индустрии программного обеспечения. Независимо от того, являетесь ли вы новичком, стремящимся укрепить свои основы, или опытным разработчиком, стремящимся повысить уровень своих способностей к решению проблем, 30-дневный курс JavaScript Leet Code предлагает прекрасную возможность попрактиковаться и улучшить свои навыки программирования. В этой статье мы подведем итог тому, что вы узнаете после этого. Давайте погрузимся прямо в.

День 1–3:закрытие JavaScript,подъем

В дни 1–3 вы решаете различные задачи, где мы узнаем о закрытии и подъеме. Подъем — это свойство в JavaScript, при котором функция может быть вызвана до ее инициализации. И это работает, только если вы определяете функцию с помощью ключевого слова function.

function mainFunction() {
  return f;
// function initialization 
  function f(a, b) {
    const sum = a + b;
    return sum;
  }
}
const f = mainFunction();
console.log(f(3, 4)); // 7

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

function createAdder(a) {
  function f(b) {
    const sum = a + b;
    return sum;
  }
  return f;
}
const f = createAdder(3);
console.log(f(4));

День 3–6:истинные и ложные значения в JavaScript,функции обратного вызова

В этом разделе вы будете решать проблемы, которые потребуют от вас реализации методов JavaScript, таких как array.map(), array.reduce(), и узнаете о функциях обратного вызова в JavaScript.

Функции обратного вызова — это функции, которые передаются в качестве аргумента другой функции и выполняются в более поздний момент времени.

function fetchData(url, callback) {
 
  setTimeout(function() {
    var data = { /* Some data retrieved from the URL */ };
    callback(data);
  }, 100); 
}

function processData(data) {
  console.log('Processing data:', data);
}

fetchData('https://example.com/api/data', processData);

Значения Truthy, Falsey — это значения, которые дадут вам true и false соответственно при использовании в операторе if. Это определенно странная особенность JavaScript. Вот несколько примеров, на которые стоит обратить внимание:

//Truthy values
if (true) {
  console.log("true is truthy");
}

if ("hello") {
  console.log("Any Non-empty string is truthy");
}

if (42) {
  console.log("Number other than 0 is truthy");
}

if ({}) {
  console.log("Apperently, An empty object is truthy😒");
}

if ([]) {
  console.log("An empty array is truthy");
}

if (function() {}) {
  console.log("A non-empty function is truthy");
}

В то время как значения Falsey включают:

if (false) {
  console.log("false is falsy");
}

if (0) {
  console.log("0 is falsy");
}

if (null) {
  console.log("null is falsy");
}

if (undefined) {
  console.log("undefined is falsy");
}

if (NaN) {
  console.log("NaN is falsy");
}

if ("") {
  console.log("An empty string is falsy");
}

День 7–10: дросселирование, запоминание, каррирование

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

Регулирование — это метод, используемый для ограничения скорости, с которой может выполняться функция или действие. Давайте представим, что есть кнопка, на которую мы нажимаем, и каждый раз, когда мы нажимаем на нее, она выполняет задачу или запускает функцию. Это означает, что если мы нажмем на него несколько раз, он будет выполнять одну и ту же задачу снова и снова. Чтобы ограничить это, мы используем технику, называемую дросселированием.

function throttle(func, delay) {
  let lastCall = 0;
  let timeoutId;

  return function (...args) {
    const currentTime = new Date().getTime();

    // If the function hasn't been called within the delay time, execute it immediately
    if (currentTime - lastCall >= delay) {
      func.apply(this, args);
      lastCall = currentTime;
    }
    // If the function has been called within the delay time, delay the execution
    else {
      clearTimeout(timeoutId);
      timeoutId = setTimeout(() => {
        func.apply(this, args);
        lastCall = currentTime;
      }, delay);
    }
  };
}

// Example usage:
function handleClick() {
  console.log("Click event throttled");
}

const throttledClick = throttle(handleClick, 200);

window.addEventListener("click", throttledClick);

Запоминание — это метод оптимизации, который используется для предотвращения вызова функции, если входные данные совпадают. Вместо повторного вызова функции она вернет кэшированное значение. Это также очень полезно, если вы хотите выполнить задачу при вводе новых значений.

function memoize(fn) {
    const cache = {}
    return function(...args) {
        const key = JSON.stringify(args)
        // returning cached result
        if(key in cache){
            return cache[key]
        }

        cache[key] = fn(...args)

        return cache[key]
    }
}

Каррирование — это модный термин, используемый в программировании, но не волнуйтесь, это не так сложно, как кажется! Позвольте мне объяснить это вам более простыми словами. Представьте, что у вас есть функция, которой для правильной работы требуется несколько фрагментов информации. Вместо того, чтобы передавать всю информацию сразу, каррирование позволяет разбить функцию на более мелкие шаги. Каждый шаг принимает только одну часть информации и возвращает новую функцию, которая ожидает следующую часть информации. Вот пример:

function multiply(a) {
  return function (b) {
    return function (c) {
      return a * b * c;
    };
  };
}

// Example usage:
console.log(multiply(2)(3)(4)); // Output: 24

Поздравляем, вы добрались до конца 🎉🎉, теперь вы знаете некоторые общие концепции программирования, чтобы обсудить их в следующем интервью. Я рекомендую вам перейти на Leet code по ссылке ниже и принять участие в 30-дневном плане изучения JavaScript Link. Если вам нужно полное объяснение долга, зайдите на YouTube и посмотрите этот плейлист JavaScript 30-Day Challenge.