Объяснение сокращения && в JavaScript - PullRequest
0 голосов
/ 05 октября 2010

Используя плагин водяных знаков для jQuery, я пытаюсь jslint и минимизировать функции, но я столкнулся с синтаксисом, которого я никогда раньше не видел, где есть выражения, где действительно должен быть вызов или назначение функции:*

(function($) {

    $.fn.watermark = function(css, text) {

        return this.each(function() {

            var i = $(this), w;

            i.focus(function() {
                w && !(w=0) && i.removeClass(css).data('w',0).val('');
            })
                .blur(function() {
                    !i.val() && (w=1) && i.addClass(css).data('w',1).val(text);
                })
                .closest('form').submit(function() {
                    w && i.val('');
                });

            i.blur();
        });
    };

    $.fn.removeWatermark = function() {

        return this.each(function() {

            $(this).data('w') && $(this).val('');
        });
    };
})(jQuery);

Меня особенно интересуют следующие строки:

w && !(w=0) && i.removeClass(css).data('w',0).val('');

и

!i.val() && (w=1) && i.addClass(css).data('w',1).val(text);

Может кто-нибудь объяснить эту стенографию и переписать эти функции так, чтобыЯ мог бы сравнить их, чтобы лучше понять стенографию?

Спасибо.

Ответы [ 6 ]

3 голосов
/ 05 октября 2010

&& можно использовать в качестве «охранника».По сути это означает прекращение вычисления выражения, если один из операндов возвращает значение «ложь».

Отрицание выражения преобразует его в логическое значение.В частности, это выражение, которое является отрицанием выражения в зависимости от того, является ли оно «истинным» или «ложным».

2 голосов
/ 05 октября 2010

Давайте разберем каждое из утверждений, о которых вы просите, до их компонентов:

w && !(w=0) && i.removeClass(css).data('w',0).val('');
  • w - Является ли w "правдой"? (проверка на != 0 в этом случае)
  • !(w=0) - Установите w на 0, возьмите противоположное результату, чтобы цепочка && продолжалась
  • i.removeClass(css).data('w',0).val('') - Удалить класс, установить данные на 0 очистить значение.

!i.val() && (w=1) && i.addClass(css).data('w',1).val(text);
  • !i.val() - Вход пуст?
  • (w=1) - Установите w на 1
  • i.addClass(css).data('w',1).val(text); - Добавьте класс, установите для данных значение 1 и установите для текста любой текст водяного знака.

Оба из них - просто заявления к , действительно сокращению кода, конечно, за счет читабельности. Если вы смотрите на деминифицированную версию, это очень распространено, если вы не и это оригинал, преследуйте автора с помощью вилки, оригинал должен быть более читабельным, чем ИМО, хотя это хорошо для минимизированной версии.

1 голос
/ 05 октября 2010

Они могут быть переписаны как:

// w && !(w=0) && i.removeClass(css).data('w',0).val('');
if (w) {
    if (!(w=0)) {
        i.removeClass(css).data('w',0).val('');
    }
}

//!i.val() && (w=1) && i.addClass(css).data('w',1).val(text);
if (!i.val()) {
    if (w=1) {
        i.addClass(css).data('w',1).val(text);
    }
}

Использование &&, как это просто сокращение для использования вложенных if s.Его преимущества заключаются в следующем:

  1. Использует незначительно меньше символов, чем вложенные вложенные if s, уменьшая полезную нагрузку, доставляемую в браузер.
  2. Может быть быстрее читать для обученного глаза.

Хотя я должен сказать, что приведенные выше примеры являются злоупотреблением этим сокращением, поскольку используемые условия довольно сложны.Я прибегаю к этому сокращению только тогда, когда мне нужно проверить цепочку простых вещей, как в следующем примере:

function log(s) {
    window.console && console.log && console.log(s);
}
0 голосов
/ 05 октября 2010

Используя

w && !(w=0) && i.removeClass(css).data('w',0).val('');

для этого объяснения, он позволяет объединить несколько команд, одновременно гарантируя, что каждая из них верна.

Это также может быть представлено как:

if (w) {

    w = 0;
    i.removeClass(css).data('w',0).val('');
}

Сначала он проверяет, что w оценивается как true, и, если это так, он проверяет, является ли w=0 неверным (w != 0).Если это также верно, то это переходит к фактической команде.

Это обычное сокращение для многих языков, в которых используется отложенная оценка: если следующая оценка добавляется с помощью and (&&) тогда следующие команды не будут выполнены, если он вернет false.Это полезно в ситуациях, когда вы хотите выполнить какое-либо действие только в том случае, если предыдущий оператор возвращает true, например:

if (object != null && object.property == true)

, чтобы убедиться, что объект не равен нулю перед его использованием, в противном случае выбудет обращаться к нулевому указателю.

0 голосов
/ 05 октября 2010

В отношении:

w && !(w=0) && i.removeClass(css).data('w',0).val('');

код:

!(w=0) && i.removeClass(css).data('w',0).val('');

будет выполняться только в том случае, если

w

верно.

0 голосов
/ 05 октября 2010

&& - это А. Это для сравнения / составных условных выражений. Это требует, чтобы оба условия в операторе if были истинными. Я не думаю, что есть другой способ переписать его - это синтаксис для А.

...