Проблема с проверкой NaN как на правду / ложь - PullRequest
0 голосов
/ 07 октября 2018

Я делаю вызов алгоритма на freecodecamp, и решение, которое они предоставили, действительно опрятно и аккуратно:

function bouncer(arr) {
  return arr.filter(Boolean);
}

К сожалению, будучи новичком и не думая об этой функции высшего порядка, я создалэтот многословный монстр вместо этого:

 function bouncer(arr) {
    let truthyArray = [];
    let falsyArray = [];
    for (let i = 0; i < arr.length; i++) {
        if (arr[i] == false || arr[i] === null || arr[i] === NaN || arr[i] === undefined) {
            falsyArray.push(arr[i]);
        } else {
            truthyArray.push(arr[i]);
        }
    }
    return truthyArray;
}

Казалось, работа была выполнена в предыдущих тестах.Тем не менее, NaN не подыгрывает.

bouncer([1, null, NaN, 2, undefined])

возвращает:

[1, NaN, 2]

Есть какие-нибудь мысли о том, как также проверить NaN?

1 Ответ

0 голосов
/ 07 октября 2018

Проблема в том, что NaN !== NaN:

console.log(NaN === NaN);

(что имеет смысл, потому что NaN это просто заполнитель для того места, где можно ожидать числа, но числовое значение не может бытьвычисляется - например, 0 / 0 (NaN) !== ('foo' * 3) (NaN))

Вместо этого вы можете использовать Number.isNaN, который проверит, является ли переданное значение Number иNaN.

console.log(Number.isNaN(NaN));

function bouncer(arr) {
  let truthyArray = [];
  let falsyArray = [];
  for (let i = 0; i < arr.length; i++) {
    if (arr[i] == false || arr[i] === null || Number.isNaN(arr[i]) || arr[i] === undefined) {
      falsyArray.push(arr[i]);
    } else {
      truthyArray.push(arr[i]);
    }
  }
  return truthyArray;
}

console.log(bouncer([false, null, 0, NaN, undefined, ""]));

Обязательно используйте Number.isNaN, а не просто isNaN, что нежелательно исключит истинные не числа.

...