Есть ли способ преобразовать значения NaN в 0 без оператора if:
if (isNaN(a)) a = 0;
Очень раздражает каждый раз проверять мои переменные.
javascript
Тамас Пап
источник
источник
function noNaN( n ) { return isNaN( n ) ? 0 : n; }
а потом простоnoNaN( a )
Ответы:
Ты можешь сделать это:
... который преобразует из любого значения "фальси" в
0
.Значения "фальси":
false
null
undefined
0
""
( пустая строка )NaN
(Не число)Или это, если вы предпочитаете:
... который будет иметь тот же эффект, что и выше.
Если целью было проверить больше, чем просто
NaN
, то вы можете сделать то же самое, но сначала выполнить преобразование toNumber .Это использует унарный оператор +, чтобы попытаться преобразовать
a
в число. Это дает дополнительное преимущество преобразования таких вещей, как числовые строки'123'
в число.Единственной неожиданностью может быть случай, когда кто-то передает массив, который может быть успешно преобразован в число:
Здесь у нас есть массив, состоящий из одного члена, представляющего собой числовую строку. Он будет успешно преобразован в число.
источник
NaN
ценности. Это не будет работать в качестве теста для всех не числовых значений. Хотя мы могли бы сначала попытаться преобразовать toNumber. Я обновлю.Использование двойной тильды (двойного побитового НЕ)
~~
- делает некоторые интересные вещи в JavaScript. Например, вы можете использовать его вместоMath.floor
или даже в качестве альтернативыparseInt("123", 10)
! Это много обсуждалось в Интернете, поэтому я не буду вдаваться в то, почему это работает, но если вам интересно: что такое оператор «двойная тильда» (~~) в JavaScript?Мы можем использовать это свойство двойной тильды для преобразования
NaN
в число, и, к счастью, это число равно нулю!console.log(~~NaN); // 0
источник
~~
вообще, я просто использовал его наряду сparseFloat()
примерно так:~~parseFloat($variable);
. Очень аккуратно :) +1Напишите свой собственный метод и используйте его везде, где вам нужно числовое значение:
источник
null
то это не даст мне ожидаемого результата0
. Больше на мойNumber(val)
вместо этого, поскольку он возвращает,0
когда он все равно не может понять это.Что-то более простое и эффективное для чего-либо:
... который преобразует из любого значения "фальси" в
0
.Значения "фальси":
false
null
undefined
0
""
( пустая строка )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.)Возможно, для простоты написания кода вы хотите, чтобы функция получала значение от пользователя, очищала его и при необходимости предоставляла значение по умолчанию, например:
источник
Как насчет регулярного выражения ?
Код ниже будет игнорировать NaN, чтобы позволить вычисление правильно введенных чисел
Показать фрагмент кода
источник
Методы, использующие isNaN, не работают, если вы пытаетесь использовать parseInt, например:
Но во втором случае isNaN выдает false (т. Е. Нулевая строка является числом)
Таким образом, пустая строка считается действительным числом isNaN, но не parseInt. Проверено с Safari, Firefox и Chrome на OSX Mojave.
источник
источник
используя решение пользователя 113716, которое, кстати, прекрасно, чтобы избежать всех тех случаев, если я еще реализовал его таким образом, чтобы вычислить мое текстовое поле промежуточных итогов из единицы текстового поля и количества текстового поля.
В процессе записи не чисел в текстовых полях единиц и количеств их значения заменяются на ноль, поэтому при окончательном размещении пользовательских данных не будет никаких чисел.
источник
Пожалуйста, попробуйте эту простую функцию
источник