Ответ 1
Как насчет
var x = Math.max(solveForX(), 0);
Кажется, я часто обрабатываю такие особые случаи. Должен быть более сжатый синтаксис или конструкция:
var x = solveForX(); /* some slow calculation here */
if (x < 0)
{
x = 0;
}
Это эквивалентно, но не кажется более элегантным:
var x;
x = (x = solveForX()) < 0 ? 0 : x;
Может быть, есть трюк с небольшим сдвигом?
Обновление: Я провел несколько тестов, чтобы сравнить два моих любимых ответа - тот, который я принял, и Peter Ajtai's. Оказывается, Питер довольно быстро! Выполняя 1 000 000 итераций каждого (я также запускал версию, которая кэширует Math.max
, чтобы узнать, сколько времени было внесено в поиск) показывает, что Питер работает менее чем в половине времени версии Math.max
даже при кешировании max
.
Тем не менее, даже самый медленный метод все еще довольно быстрый.
Как насчет
var x = Math.max(solveForX(), 0);
Что-то вроде:
x = Math.max(0, solveForX());
(x < 0) && (x = 0);
Изменить: Удалено оператор if. Спасибо Андреасу.
Это одна строка, и она ясно показывает, что она делает (по моему личному мнению) - , если вы знакомы с булевой оценкой короткого замыкания.
В приведенном выше примере используется логическая оценка короткого замыкания. Это может быть очень полезно в определенных ситуациях (особенно для арифметики указателей в С++, но также в 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>
Я бы украсил оригинальную функцию solveForX
.
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()
, что, вероятно, не стоит заботиться)
Я думаю, что этот способ довольно приятный!
var x = Math.max(solveForX(), 0);
Удачи!