Я, кажется, обрабатываю особые случаи как это несколько часто. Там получен, чтобы быть более кратким синтаксисом или конструкцией:
var x = solveForX(); /* some slow calculation here */
if (x < 0)
{
x = 0;
}
Это эквивалентно, но больше не чувствует себя изящным:
var x;
x = (x = solveForX()) < 0 ? 0 : x;
Возможно, существует немного приема сдвига?
Обновление: Я выполнил некоторые сравнительные тесты для сравнения моих двух любимых ответов - тот, который я принял, и Peter Ajtai. Оказывается, что Peter вполне немного быстрее! Выполнение 1 000 000 повторений каждого (я также выполнил версию, которую это кэширует Math.max
видеть сколько времени внесенный поиск), показывает что выполнения Peter менее чем в половину времени Math.max
версия, даже с max
кэширование.
Тем не менее даже "самый медленный" метод все еще довольно быстр.
(x < 0) && (x = 0);
Редактировать: Удален оператор if. Спасибо, Андреас.
Это одна строка, и ясно, что она делает (по моему личному мнению) - , если вы знакомы с логической оценкой короткого замыкания.
Вышеупомянутое использует логическую оценку короткого замыкания . Это может быть очень полезно в определенных ситуациях (особенно в арифметике указателей в C ++, но логическая оценка короткого замыкания также работает в Javascript).
x = 0
оценивается, только если x <0
.
Вот два примера:
Это предупреждение 1:
<script type="text/javascript">
var x = 1;
(x < 0) && (x = 0);
alert(x);
</script>
Это предупреждение 0:
<script type="text/javascript">
var x = -1;
(x < 0) && (x = 0);
alert(x);
</script>
Я бы украсил оригинальную функцию resolveForX
.
function returnNonNegative(fn) {
function _f() {
var x = fn();
if (x < 0) {
x = 0;
}
return x;
}
return _f;
}
solveForX = returnNonNegative(solveForX);
В этом конкретном случае использование Math.max
кажется приемлемым, но этот шаблон обеспечивает общее решение для этого типа проблем.
Принятый ответ идеален. Если вы хотите добиться того же самого без вызова функции, я считаю, что это наиболее лаконично:
var x;
(x = solveForX()) > 0 || (x = 0);
(В Safari эта реализация на целых 7% быстрее, чем Math.max()
, о чем, вероятно, не стоит беспокоиться)