Существует ли дождевик способ сделать это?

Я, кажется, обрабатываю особые случаи как это несколько часто. Там получен, чтобы быть более кратким синтаксисом или конструкцией:

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 кэширование.

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

16
задан Community 23 May 2017 в 11:48
поделиться

5 ответов

Как насчет

var x = Math.max(solveForX(), 0);
29
ответ дан 30 November 2019 в 15:43
поделиться
(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>
8
ответ дан 30 November 2019 в 15:43
поделиться

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

x = Math.max(0, solveForX());
10
ответ дан 30 November 2019 в 15:43
поделиться

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

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

solveForX = returnNonNegative(solveForX);

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

2
ответ дан 30 November 2019 в 15:43
поделиться

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

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

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

0
ответ дан 30 November 2019 в 15:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: