Преобразование NaN в 0 в javascript

Есть ли способ преобразовать значения NaN в 0 без оператора if:

if (isNaN(a)) a = 0;

Очень сложно проверять мои переменные каждый раз.

Ответ 1

Вы можете сделать это:

a = a || 0

..., который преобразует a из любого значения "falsey" в 0.

Значения "falsey":

  • false
  • null
  • undefined
  • 0
  • "" (пустая строка)
  • NaN (не номер)

Или это, если вы предпочитаете:

a = a ? a : 0;

... который будет иметь тот же эффект, что и выше.


EDIT:

Если целью было тестирование более чем на NaN, вы можете сделать то же самое, но сначала выполните преобразование toNumber.

a = +a || 0

Это использует оператор унарного +, чтобы попытаться преобразовать a в число. Это имеет дополнительное преимущество преобразования чисел, таких как числовые строки '123' в число.

Единственная неожиданная вещь может быть, если кто-то передает массив, который может быть успешно преобразован в число:

+['123']  // 123

Здесь мы имеем массив, который имеет единственный член, который является числовой строкой. Он будет успешно преобразован в число.

Ответ 2

Создайте свой собственный метод и используйте его везде, где вы хотите получить значение:

function getNum(val) {
   if (isNaN(val)) {
     return 0;
   }
   return val;
}

Ответ 3

Использование двойной тильды (double bitwise NOT) - ~~ - делает некоторые интересные вещи в JavaScript. Например, вы можете использовать его вместо Math.floor или даже как альтернативу parseInt("123", 10)! Это обсуждалось много в Интернете, поэтому я не буду заниматься тем, почему он работает здесь, но если вам интересно: Что такое "двойная тильда" , (~~) в JavaScript?

Мы можем использовать это свойство double-tilde для преобразования NaN в число и, к счастью, это число равно нулю!

console.log(~~NaN); // 0

Ответ 4

Вместо того, чтобы блокировать его, чтобы вы могли продолжить, почему бы не создать резервную копию и не удивиться, почему вы в первую очередь работаете в NaN?

Если какой-либо из числовых входов в операцию является NaN, выход также будет NaN. То, как работает текущий стандарт IEEE Floating Point (это не только Javascript). Это поведение по уважительной причине: основное намерение состоит в том, чтобы удержать вас от использования фиктивного результата, не понимая его подделкой.

Как работает NaN, если что-то пойдет не так, как в какой-то суб-под-под-операции (создавая NaN на этом более низком уровне), конечным результатом будет также NaN, который вы сразу же узнаете как ошибку даже если ваша логика обработки ошибок (throw/catch, возможно?) еще не завершена.

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

Общей проблемой в Javascript является то, что как parseInt(...), так и parseFloat(...) возвратят NaN, если будут даны бессмысленные аргументы (null, '' и т.д.). Устраните проблему на самом низком уровне, а не на более высоком уровне. Тогда результат общего расчета имеет хорошие шансы получить смысл, и вы не подменяете какое-либо магическое число (0 или 1 или другое) для результата всего расчета. (Трюк (parseInt (foo.value) || 0) работает только для сумм, а не для продуктов - для продуктов, для которых значение по умолчанию должно быть 1, а не 0, но не если указанное значение действительно равно 0.)

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

function getFoobarFromUser(elementid) {
        var foobar = parseFloat(document.getElementById(elementid).innerHTML)
        if (isNaN(foobar)) foobar = 3.21;       // default value
        return(foobar.toFixed(2));
}

Ответ 5

с использованием пользовательского решения 113716, которое, кстати, отлично помогает избежать всех этих if-else Я реализовал его таким образом, чтобы вычислить текстовое поле в текстовом поле и количество текстовых полей.

В процессе написания не чисел в текстовых единицах единиц и количества их значения заменяются на bing на ноль, поэтому окончательная публикация пользовательских данных не имеет никаких номеров.

     <script src="/common/tools/jquery-1.10.2.js"></script>
     <script src="/common/tools/jquery-ui.js"></script>

     <!----------------- link above 2 lines to your jquery files ------>





    <script type="text/javascript" >
    function calculate_subtotal(){

    $('#quantity').val((+$('#quantity').val() || 0));
    $('#unit').val((+$('#unit').val() || 0));

    var  calculated = $('#quantity').val() * $('#unit').val() ;
    $('#subtotal').val(calculated);


    }
    </script>


      <input type = "text" onChange ="calculate_subtotal();" id = "quantity"/>
      <input type = "text" onChange ="calculate_subtotal();" id = "unit"/>
      <input type = "text" id = "subtotal"/>

Ответ 6

var i = [NaN, 1,2,3];

var j = i.map(i =>{ return isNaN(i) ? 0 : i});

console.log(j)

[0,1,2,3]

Ответ 7

Попробуйте эту простую функцию

var NanValue = function (entry) {
    if(entry=="NaN") {
        return 0.00;
    } else {
        return entry;
    }
}

Спасибо

Ответ 8

Самый популярный ответ сработал у меня, а также вы можете смешивать его с несколькими арифметическими операциями, такими как:

(((400-200)*100)/750 || 0).toFixed(1);