Есть ли более приятный способ сделать это? - PullRequest
16 голосов
/ 20 июля 2010

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

var x = solveForX(); /* some slow calculation here */
if (x < 0)
{
    x = 0;
}

Это эквивалентно, но не выглядит более элегантно:

var x;
x = (x = solveForX()) < 0 ? 0 : x;

Может быть, есть небольшая хитрость?


Обновление: Я провел некоторые тесты , чтобы сравнить два моих любимых ответа - тот, который я принял, и Питера Айтая. Оказывается, Питер немного быстрее! Выполнение 1 000 000 итераций каждой (я также запустил версию, которая кеширует Math.max, чтобы увидеть, сколько времени внес вклад в поиск), показывает, что Питер работает меньше, чем половина версии Math.max, даже с кэшированием max. *

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

Ответы [ 6 ]

29 голосов
/ 20 июля 2010

Как насчет

var x = Math.max(solveForX(), 0);
10 голосов
/ 20 июля 2010

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

x = Math.max(0, solveForX());
8 голосов
/ 20 июля 2010
(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>
2 голосов
/ 20 июля 2010

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

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

solveForX = returnNonNegative(solveForX);

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

0 голосов
/ 29 апреля 2011

Я думаю, что этот способ довольно хорош!

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

Удачи!

0 голосов
/ 21 июля 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...