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, введите здесь описание изображения