2013-06-04 4 views
1

Jshint не доволен этим выражением:Проверка NaN или <= 0

var amount = $('.some-input').val() 
// Check for NaN or <= 0 
if (!(+amount > 0)) { 
    ... 
} 

Он утверждает запутанным использование!. Есть ли способ переписать выражение без добавления слишком большого количества кода?

+5

Ну, 'if (isNaN (amount) || + amount <= 0)' ... – Bergi

+0

Или просто переместите '+' перед '' ', позволяя упростить условное выражение. Это также кажется мне естественным, так как в «' amount' есть числовое значение ... ». – Jon

+2

Почему вы думаете, что вам нужно будет переписать выражение? Jshint ошибается, он не видит, что он правильно документирован. – Bergi

ответ

6

Эквивалент без отрицания:

if (amount <= 0 || isNaN(amount)) { 

Таким образом, вместо того, чтобы говорить «не больше, чем», вы говорите «Меньше или равно». Кроме того, не все могут знать, что NaN действительно не может сравниться с числами (т. Е. Всегда возвращает false), и поэтому явный тест может облегчить чтение и понимание этого выражения.

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

+1

Нет. Если вы разместите здесь «NaN», результат будет иным. Логика тройная :-) – Bergi

+0

@PaulS: Какое правильное выражение? –

+0

@Bergi: Верно ... может быть, вы должны поместить свой комментарий в качестве ответа тогда, потому что это единственный правильный. –

2

Вы могли бы написать

if (amount > 0 === false) { 

строка автоматически преобразуется в число, когда в этом сравнении, и любая строка, которая не может быть правильно разобрано как число преобразуется в NaN, который не является >0. И jshint, кажется, радует, когда видит === false вместо удобного !.

Но реальное решение кажется не Использование jshint, что не имеет отношения к данному вопросу. Этот инструмент не позволяет использовать возможности JavaScript.

Если вы решили отказаться от jshint, я бы до сих пор советую вам упростить немного ваш тест как

if (!(amount > 0)) { 

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

+0

также работает для неопределенного, null. – Discipol

+0

Не знаете, почему jshint не знает, чтобы предупредить «* не сравнивать с логическими *» - я нахожу это выражение более запутанным, чем отрицание :-) – Bergi

+0

@ Bergi I тоже. Но это не первый раз, когда я сталкиваюсь с этим «качественным» инструментом, и я не воспринимаю его очень серьезно. –

Смежные вопросы