undefined и NaN, преобразовать в логическое значение неявно против явно

В настоящее время я изучаю javascript, следуя книге "Вы не знаете JS".

В разделе " Тип и грамматика " автор обсуждает неявное и явное булево преобразование.

//come up with a function that make sure only one argument is truthy

//implicit convertion
function onlyOne() {
  var sum = 0;
  for (var i=0; i < arguments.length; i++) {
      // skip falsy values. same as treating
      // them as 0's, but avoids NaN's.
      if (arguments[i]) {
          sum += arguments[i];
      }
  }
  return sum == 1;
}

//explicit convertion
function onlyOne() {
  var sum = 0;
  for (var i=0; i < arguments.length; i++) {
      sum += Number( !!arguments[i] );
  }
  return sum === 1;
}

Является ли явная форма принуждения этой утилитой "лучше"? Это избегает NaN ловушка, как описано в комментариях к коду. Но, в конечном итоге, это зависит от ваших потребностей. Я лично считаю, что прежняя версия, опираясь на неявное принуждение, более элегантна (если вы не будете сдавать undefined или же NaN), и явная версия излишне более многословна.

Мой вопрос в том, что NaN ловушка автор говорит о? Я думал когда undefined а также NaN преобразуется в логическое значение, независимо от того, преобразуется ли оно неявно или явно, оба результата приводят к false, И прохождение undefined а также NaN с неявной функцией все в порядке, верно?

2 ответа

Я думаю, что примером настоящей явной проверки будет...

function onlyOne() {
  var sum = 0;
  for (var i=0; i < arguments.length; i++) {
      sum += Boolean( arguments[i] );
  }
  return sum == 1;
}

Это, конечно, будет избегать / защищать от NaN и должно возвращать false, если нет аргументов; если никакие аргументы не являются правдивыми и, конечно, если более одного аргумента являются правдивыми.

2-й пример всегда избегает NaN, потому что Number(!!string) и Number(!!object) оба преобразуются в 1, введите здесь описание изображения

Другие вопросы по тегам