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

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

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

console.log(0 / 0);          // NaN
console.log(Math.sqrt(-1));   // NaN
console.log(parseInt("abc")); // NaN

Особенности NaN:

  1. NaN не равно самому себе: Это уникальное поведение, так как в JavaScript NaN !== NaN. То есть, проверка на равенство NaN с самим собой всегда возвращает false.

    console.log(NaN === NaN);  // false
  2. typeof NaN возвращает "number": Хотя это "не число", NaN относится к числовому типу.

    console.log(typeof NaN);  // "number"

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

  1. Функция isNaN(): Она проверяет, является ли значение NaN. Однако isNaN() также возвращает true, если значение не может быть преобразовано в число, например, для строк.

    console.log(isNaN(NaN));        // true
    console.log(isNaN("abc"));      // true
  2. Функция Number.isNaN(): Этот метод проверяет строгое равенство с NaN. Он вернёт true, только если значение действительно является NaN, и не будет ошибочно возвращать true для некорректных строк или других типов данных.

    console.log(Number.isNaN(NaN));        // true
    console.log(Number.isNaN("abc"));      // false
    console.log(Number.isNaN(undefined));  // false

Почему важно использовать Number.isNaN():

isNaN() преобразует аргумент к числу, а затем проверяет, является ли результат NaN. Это может приводить к нежелательным результатам, когда isNaN() возвращает true для строк, которые не являются числом. Number.isNaN() проверяет без приведения типов, что делает его более надёжным для определения реального значения NaN.

Разница между .some() и .every()?

Методы .some() и .every() в JavaScript работают с массивами и проверяют элементы на выполнение определенного условия.

.some()

Метод .some() проверяет, удовлетворяет ли хотя бы один элемент массива условию, заданному функцией. Возвращает true, если хотя бы один элемент прошел проверку.

const arr = [1, 2, 3, 4, 5];
const result = arr.some(num => num > 3); // true

.every()

Метод .every() проверяет, удовлетворяют ли все элементы массива условию, заданному функцией. Возвращает true, если все элементы прошли проверку.

const arr = [1, 2, 3, 4, 5];
const result = arr.every(num => num > 0); // true

Ключевые отличия:

  • .some() возвращает true, если хотя бы один элемент удовлетворяет условию.
  • .every() возвращает true, если все элементы удовлетворяют условию.