У JavaScript есть оценка "короткого замыкания"?

Я хотел бы знать, если JavaScript имеет "короткое замыкание" оценки, как && Operator в С#. Если нет, я хотел бы знать, есть ли обходной путь, который имеет смысл принять.

Ответ 1

Да, JavaScript имеет оценку "короткого замыкания".

if (true == true || foo.foo){
    // Passes, no errors because foo isn't defined.
}

Live DEMO

if (false && foo.foo){
    // Passes, no errors because foo isn't defined.
}

Live DEMO

Ответ 2

В этом ответе подробно рассказывается о том, как работает в JavaScript, со всеми хитростями и соответствующими темами, такими как приоритет операторов, если вы ищете быстрое определение и уже понимаете, как работает короткое замыкание, я бы порекомендовал проверка других ответов.


Что мы (думали мы) знали до сих пор:

Сначала давайте проверим поведение, с которым мы все знакомы, внутри блока if(), где мы используем && чтобы проверить, true ли эти две вещи:

if (true && true) {
   console.log('bar');
} 

Теперь ваш первый инстинкт, вероятно, говорит: "Да, довольно просто, код выполняет инструкцию, если и expr1 и expr2 оценены как true ".

Ну да и нет. Вы технически верны, это поведение, которое вы описали, но это не совсем то, как оценивается код, и нам нужно глубже вникнуть, чтобы полностью понять.


Как именно это && и || интерпретированы?:

Пришло время заглянуть "под капот двигателя ". Давайте рассмотрим этот практический пример:

function sanitise(x) {
  if (isNaN(x)) {
    return NaN;
  }
  return x;
}

let userinput = 0xFF; // as an example
const res = sanitise(userinput) && userinput + 5

console.log(res);