Есть ли способ преобразовать значения NaN в 0 без оператора if:
if (isNaN(a)) a = 0;
Очень раздражает каждый раз проверять мои переменные.
function noNaN( n ) { return isNaN( n ) ? 0 : n; }а потом простоnoNaN( a )
Есть ли способ преобразовать значения NaN в 0 без оператора if:
if (isNaN(a)) a = 0;
Очень раздражает каждый раз проверять мои переменные.
function noNaN( n ) { return isNaN( n ) ? 0 : n; }а потом простоnoNaN( a )
Ответы:
Ты можешь сделать это:
a = a || 0
... который преобразует из любого значения "фальси" в 0.
Значения "фальси":
falsenullundefined0"" ( пустая строка )NaN (Не число)Или это, если вы предпочитаете:
a = a ? a : 0;
... который будет иметь тот же эффект, что и выше.
Если целью было проверить больше, чем просто NaN, то вы можете сделать то же самое, но сначала выполнить преобразование toNumber .
a = +a || 0
Это использует унарный оператор +, чтобы попытаться преобразовать aв число. Это дает дополнительное преимущество преобразования таких вещей, как числовые строки '123'в число.
Единственной неожиданностью может быть случай, когда кто-то передает массив, который может быть успешно преобразован в число:
+['123'] // 123
Здесь у нас есть массив, состоящий из одного члена, представляющего собой числовую строку. Он будет успешно преобразован в число.
NaNценности. Это не будет работать в качестве теста для всех не числовых значений. Хотя мы могли бы сначала попытаться преобразовать toNumber. Я обновлю.
Использование двойной тильды (двойного побитового НЕ) ~~- делает некоторые интересные вещи в JavaScript. Например, вы можете использовать его вместо Math.floorили даже в качестве альтернативы parseInt("123", 10)! Это много обсуждалось в Интернете, поэтому я не буду вдаваться в то, почему это работает, но если вам интересно: что такое оператор «двойная тильда» (~~) в JavaScript?
Мы можем использовать это свойство двойной тильды для преобразования NaNв число, и, к счастью, это число равно нулю!
console.log(~~NaN); // 0
~~вообще, я просто использовал его наряду с parseFloat()примерно так: ~~parseFloat($variable);. Очень аккуратно :) +1
Напишите свой собственный метод и используйте его везде, где вам нужно числовое значение:
function getNum(val) {
if (isNaN(val)) {
return 0;
}
return val;
}
Number(val)вместо этого, поскольку он возвращает, 0когда он все равно не может понять это.
Что-то более простое и эффективное для чего-либо:
function getNum(val) {
val = +val || 0
return val;
}
... который преобразует из любого значения "фальси" в 0.
Значения "фальси":
falsenullundefined0"" ( пустая строка )NaN (Не число)Вместо того, чтобы ставить его в тупик, чтобы продолжить, почему бы не сделать резервную копию и не задуматься, почему вы столкнулись с NaN?
Если какой-либо из числовых входов для операции является NaN, выход также будет NaN. Именно так работает текущий стандарт IEEE с плавающей точкой (это не только Javascript). Это поведение по уважительной причине : основная цель состоит в том, чтобы удержать вас от использования фиктивного результата, даже не осознавая его фиктивность.
Способ работы NaN заключается в том, что если что-то идет не так, как надо, в какой-то под-под-подоперации (создание NaN на этом более низком уровне), конечный результат также будет будет NaN, который вы сразу же признаете ошибочным, даже если ваш Логика обработки ошибок (возможно, throw / catch?) еще не завершена.
NaN как результат арифметического расчета всегда указывает на то, что что-то пошло не так в деталях арифметики. Это способ для компьютера сказать «отладка необходима здесь». Вместо того, чтобы найти какой-либо способ продолжить с каким-то числом, которое вряд ли когда-либо окажется правильным (действительно ли 0 соответствует вашему желанию?), Почему бы не найти проблему и устранить ее.
Распространенной проблемой в 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));
}
Как насчет регулярного выражения ?
function getNum(str) {
return /[-+]?[0-9]*\.?[0-9]+/.test(str)?parseFloat(str):0;
}
Код ниже будет игнорировать NaN, чтобы позволить вычисление правильно введенных чисел
Методы, использующие isNaN, не работают, если вы пытаетесь использовать parseInt, например:
parseInt("abc"); // NaN
parseInt(""); // NaN
parseInt("14px"); // 14
Но во втором случае isNaN выдает false (т. Е. Нулевая строка является числом)
n="abc"; isNaN(n) ? 0 : parseInt(n); // 0
n=""; isNaN(n) ? 0: parseInt(n); // NaN
n="14px"; isNaN(n) ? 0 : parseInt(n); // 14
Таким образом, пустая строка считается действительным числом isNaN, но не parseInt. Проверено с Safari, Firefox и Chrome на OSX Mojave.
var i = [NaN, 1,2,3];
var j = i.map(i =>{ return isNaN(i) ? 0 : i});
console.log(j)
[0,1,2,3]
используя решение пользователя 113716, которое, кстати, прекрасно, чтобы избежать всех тех случаев, если я еще реализовал его таким образом, чтобы вычислить мое текстовое поле промежуточных итогов из единицы текстового поля и количества текстового поля.
В процессе записи не чисел в текстовых полях единиц и количеств их значения заменяются на ноль, поэтому при окончательном размещении пользовательских данных не будет никаких чисел.
<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 NanValue = function (entry) {
if(entry=="NaN") {
return 0.00;
} else {
return entry;
}
}