Техника кодирования JavaScript или плохой код?

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

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

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

Является ли цель 2-й строки в функции doItNow() проверять, существует ли doSomething и затем вызвать ее? Например:

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

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

Ответы

Ответ 1

Это "стенография". Правая сторона выполняется только тогда, когда левая сторона проходит как оператор if().

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


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

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

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

a || alert('Not a');

Ответ 2

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

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

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

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

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

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

Если вы хотите:

  • Убедитесь, что идентификатор существует, и
  • Убедитесь, что он доступен

Вы можете:

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

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

Ответ 3

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