Вопрос

При отладке JavaScript написана кем-то еще, я наткнулся на какой-то код, который я не видел раньше. Вот образец:

function doSomething() {
    //doing something here...
}

function doItNow() {
    //other logic...
    doSomething && doSomething();    // <=== What's this?
}

Это цель 2-й строки в функции doitnow (), чтобы проверить, существует ли дошутность, а затем называть это? Вот так:

function doItNow() {
    //other logic...
    if (doSomething) {
        doSomething();
    }
}

Jslint не нравится, и я бы предпочел не иметь плохого кода в моем приложении. Любые идеи?

Это было полезно?

Решение

Это действительно «сокращение». Правая сторона выполнена только, когда левая сторона проходит как if() утверждение.

Компилятор закрытия Google и другие минихии используют это; Если ваш вклад if(a) a(), это приведет к a&&a()


Вы могли бы сделать то же самое с ||, Например:

if( !a ){
  alert('Not a');
}

можно записать как

a || alert('Not a');

Другие советы

Да, ваши два примера являются «эквивалентными», && Оператор выполняет Оценка короткого замыкания.

Если первое выражение операнда дает ложный значение (например, как null, undefined, 0, NaN, пустая строка, и, конечно, false), второе выражение операнда будет нет быть оцененным, и если значение правдивость, вызов функции будет сделан.

Но если doSomething не был объявлен, ваши оба примера не удастся.

Если идентификатор, который не объявлен, ссылается на код, вы получите ReferenceError Исключение, например:

function foo() {
  undeclared && undeclared();
}

try {
  foo(); 
} catch (e) {
  alert(e);  // ReferenceError!
}

Если хотите:

  1. Убедитесь, что идентификатор существует, и
  2. Убедитесь, что это Callable.

Ты сможешь:

if (typeof doSomething == 'function') {
  doSomething();
}

То typeof оператор Можно безопасно использовать на идентификаторах, которые не существуют, дополнительно, проверяя, что doSomething Это функция, вы убедитесь, что вы сможете его вызвать.

Функции вызова (или назначения и т. Д.) В сравнениях, как правило, плохая идея. Люди обычно не ожидают сравнения иметь побочные эффекты. Этот случай достаточно прост, чтобы это мощь быть оправданным, но если кто-то не понимает, что Конвенция, им, возможно, придется спросить в StackoverFlow;)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top