Подтвердить что ты не робот

Есть ли более легкий способ сделать это?

Кажется, я часто обрабатываю такие особые случаи. Должен быть более сжатый синтаксис или конструкция:

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.

Тем не менее, даже самый медленный метод все еще довольно быстрый.

4b9b3361

Ответ 1

Как насчет

var x = Math.max(solveForX(), 0);

Ответ 2

Что-то вроде:

x = Math.max(0, solveForX());

Ответ 3

(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>

Ответ 4

Я бы украсил оригинальную функцию solveForX.

function returnNonNegative(fn) {
    function _f() {
        var x = fn();
        if (x < 0) {
            x = 0;
        }
        return x;
    }
    return _f;
}

solveForX = returnNonNegative(solveForX);

В этом конкретном случае использование Math.max кажется прекрасным, но этот шаблон обеспечивает общее решение для этого типа проблем.

Ответ 5

Принятый ответ совершенен. Если вы хотите сделать то же самое без вызова функции, я считаю, что это наиболее красноречиво:

var x;
(x = solveForX()) > 0 || (x = 0);

(В Safari эта реализация представляет собой целую 7% быстрее, чем Math.max(), что, вероятно, не стоит заботиться)

Ответ 6

Я думаю, что этот способ довольно приятный!

var x = Math.max(solveForX(), 0);

Удачи!