Вопросы и задачи на собеседованиях 178

Разница между .call(), .apply() и .bind()?

В JavaScript методы .call(), .apply() и .bind() используются для управления контекстом выполнения функций, т.е. для указания, каким объектом будет this внутри функции.

1. .call()

Метод .call() вызывает функцию с явным указанием контекста this и аргументами, переданными по отдельности.

function greet(greeting, punctuation) {
  console.log(greeting + ', ' + this.name + punctuation);
}

const person = { name: 'Alice' };

greet.call(person, 'Hello', '!'); // Output: "Hello, Alice!"
  • Аргументы передаются через запятую.

2. .apply()

Метод .apply() схож с .call(), но аргументы передаются в виде массива.

greet.apply(person, ['Hi', '...']); // Output: "Hi, Alice..."
  • Аргументы передаются в массиве.

3. .bind()

Метод .bind() не вызывает функцию немедленно, а возвращает новую функцию с указанным контекстом this, которая может быть вызвана позже.

const greetPerson = greet.bind(person, 'Hey', '.');
greetPerson(); // Output: "Hey, Alice."
  • Возвращает новую функцию, связанную с переданным контекстом this.

  • Позволяет передавать частичные аргументы (каррирование).

  • .call() — вызывает функцию с контекстом и аргументами, переданными по отдельности.

  • .apply() — вызывает функцию с контекстом и аргументами в виде массива.

  • .bind() — возвращает новую функцию с указанным контекстом, но не вызывает её сразу.

Что такое IIFE?

IIFE (Immediately Invoked Function Expression) — это функция в JavaScript, которая создаётся и вызывается немедленно. Она используется для изоляции переменных и создания локальной области видимости, предотвращая "засорение" глобальной области видимости.

Пример IIFE:

(function() {
  console.log("Это IIFE!");
})();

Объяснение:

  1. Функциональное выражение: (function() { ... }) — это анонимная функция, заключённая в скобки, чтобы сделать её выражением.
  2. Немедленный вызов: () — эти скобки сразу вызывают функцию.

Почему используется IIFE:

  1. Изоляция переменных: Переменные внутри IIFE не попадают в глобальную область видимости, что помогает избежать конфликтов имён переменных.
  2. Модульный код: Часто используется для создания модулей, которые работают независимо друг от друга.
  3. Закрытие (closure): IIFE создаёт локальную область видимости, и переменные внутри неё могут быть замкнуты и доступны только в пределах этой функции.

Пример с переменными:

(function() {
  let message = "Привет, мир!";
  console.log(message);  // "Привет, мир!"
})();

// console.log(message);  // Ошибка! message не доступна вне IIFE

В этом примере переменная message доступна только внутри IIFE и не может быть использована снаружи.

Что такое NaN? Как определить, что значение равно NaN?

NaN (Not-a-Number) — это специальное значение в программировании, которое используется для представления чисел, результат которых неопределен или не может быть выражен в числовом формате. Например, деление 0 на 0 или результат корня из отрицательного числа.

Как определить, что значение равно NaN?

В JavaScript есть специальная функция для проверки, является ли значение NaN:

isNaN(value)

Однако есть важный момент: NaN не равен самому себе, что делает его уникальным среди значений. Чтобы точно проверить, является ли значение NaN, рекомендуется использовать:

Number.isNaN(value)

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

Пример:

console.log(NaN === NaN); // false
console.log(isNaN(NaN)); // true
console.log(Number.isNaN(NaN)); // true

Источники NaN

Значение NaN может появиться в нескольких случаях, например:

  • Результат недопустимых математических операций, таких как деление 0 на 0
  • Преобразование нечислового значения в число, например, при использовании функции parseInt на строке, которая не содержит чисел