Есть ли способ преобразовать значения NaN в 0 без оператора if:
if (isNaN(a)) a = 0;
Очень сложно проверять мои переменные каждый раз.
Есть ли способ преобразовать значения NaN в 0 без оператора if:
if (isNaN(a)) a = 0;
Очень сложно проверять мои переменные каждый раз.
Вы можете сделать это:
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
Здесь мы имеем массив, который имеет единственный член, который является числовой строкой. Он будет успешно преобразован в число.
Создайте свой собственный метод и используйте его везде, где вы хотите получить значение:
function getNum(val) {
if (isNaN(val)) {
return 0;
}
return val;
}
Использование двойной тильды (double bitwise NOT) - ~~
- делает некоторые интересные вещи в JavaScript. Например, вы можете использовать его вместо Math.floor
или даже как альтернативу parseInt("123", 10)
! Это обсуждалось много в Интернете, поэтому я не буду заниматься тем, почему он работает здесь, но если вам интересно: Что такое "двойная тильда" , (~~) в JavaScript?
Мы можем использовать это свойство double-tilde для преобразования NaN
в число и, к счастью, это число равно нулю!
console.log(~~NaN); // 0
Вместо того, чтобы блокировать его, чтобы вы могли продолжить, почему бы не создать резервную копию и не удивиться, почему вы в первую очередь работаете в 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));
}
с использованием пользовательского решения 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"/>
var i = [NaN, 1,2,3];
var j = i.map(i =>{ return isNaN(i) ? 0 : i});
console.log(j)
[0,1,2,3]
Попробуйте эту простую функцию
var NanValue = function (entry) {
if(entry=="NaN") {
return 0.00;
} else {
return entry;
}
}
Спасибо
Самый популярный ответ сработал у меня, а также вы можете смешивать его с несколькими арифметическими операциями, такими как:
(((400-200)*100)/750 || 0).toFixed(1);