Я хотел бы знать, если JavaScript имеет "короткое замыкание" оценки, как && Operator в С#. Если нет, я хотел бы знать, есть ли обходной путь, который имеет смысл принять.
У JavaScript есть оценка "короткого замыкания"?
Ответ 1
Да, JavaScript имеет оценку "короткого замыкания".
if (true == true || foo.foo){
// Passes, no errors because foo isn't defined.
}
if (false && foo.foo){
// Passes, no errors because foo isn't defined.
}
Ответ 2
В этом ответе подробно рассказывается о том, как short-circuiting работает в JavaScript, со всеми хитростями и соответствующими темами, такими как приоритет операторов, если вы ищете быстрое определение и уже понимаете, как работает короткое замыкание, я бы порекомендовал проверка других ответов.
Что мы (думали мы) знали до сих пор:
Сначала давайте проверим поведение, с которым мы все знакомы, внутри блока if()
, где мы используем &&
чтобы проверить, true
ли эти две вещи:
if (true && true) {
console.log('bar');
}
Теперь ваш первый инстинкт, вероятно, говорит: "Да, довольно просто, код выполняет инструкцию, если и expr1
и expr2
оценены как true
".
Ну да и нет. Вы технически верны, это поведение, которое вы описали, но это не совсем то, как оценивается код, и нам нужно глубже вникнуть, чтобы полностью понять.
Как именно это &&
и ||
интерпретированы?:
Пришло время заглянуть "под капот двигателя javascript". Давайте рассмотрим этот практический пример:
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);