Я хотів би знати, чи має JavaScript оцінку "короткого замикання", як && Operator у C #. Якщо ні, я хотів би знати, чи є якийсь обхідний шлях, який має сенс прийняти.
Я хотів би знати, чи має JavaScript оцінку "короткого замикання", як && Operator у C #. Якщо ні, я хотів би знати, чи є якийсь обхідний шлях, який має сенс прийняти.
Відповіді:
Так, 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.
}
Short-circuitз цим логічним оператором бути не може . Просто спробуйте самі. Використовуйте мою демонстрацію.
Ця відповідь детально описує, як коротке замиканняпрацює в 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);
Ну результат 260... але чому? Щоб отримати відповідь, нам слід зрозуміти, як працює оцінка короткого замикання.
За визначенням MDN
&&операторexpr1 && expr2виконується followingly:Якщо
expr1їх можна перетворитиtrue, повертаєтьсяexpr2; інше, повертаєтьсяexpr1.
Отже, це означає, що на нашому практичному прикладі const resоцінюється наступним чином:
expr1-sanitise(0xFF)0xFF є дійсним шістнадцятковим числом для 250, інакше я б повернув NaNexpr1Повернув «truthy» значення, час виконання expr2 ( в іншому випадку я б зупинити , як NaNце falsy)userinputце істинний (число), я можу додати +5до ньогоОтже, тут ми змогли уникнути додаткових ifблоків та подальших isNaNперевірок простим використанням &&оператора.
До теперішнього часу ми повинні мати принаймні уявлення про те, як коротке замиканняпрацюють оператори. Загальне правило:
(some falsy expression) && expr оцінить до хибного виразу(some truthy expression) || expr буде оцінювати до правдивого виразуОсь ще кілька прикладів для кращого розуміння:
function a() { console.log('a'); return false; }
function b() { console.log('b'); return true; }
if ( a() && b() ){
console.log('foobar');
}
//Evaluates a() as false, stops execution.
function a() { console.log('a'); return false; }
function b() { console.log('b'); return true; }
if ( a() || b() ){
console.log('foobar');
}
/* 1. Evaluates a() as false
2. So it should execute expr2, which is `b()`
3. b() returned as true, executing statement `console.log('foobar');`
*/
Приємно, сподіваємось, ви звикли! Останнє, що нам потрібно знати, це правило про пріоритет оператора, тобто:
&&Оператор завжди виконується до ||оператора.Розглянемо наступний приклад:
function a() { console.log('a'); return true;}
function b() { console.log('b'); return false;}
function c() { console.log('c'); return false;}
console.log(a() || b() && c());
// returns a() and stops execution
Це повернеться як, можливо, заплутано для когось як a(). Причина досить проста, це просто наш погляд, який нас як би обманює, тому що ми звикли читати зліва направо. Давайте розберемо те, console.log()що не, і зосередимось виключно на оцінці
true || false && false
Тепер, щоб обернути голову навколо цього:
Ми сказали, що &&оператор має пріоритет, тому він оцінюється як перший. Щоб допомогти нам краще уявити оцінку, подумайте про визначення
expr1 && expr2
Де:
expr2 є falseexpr1 є true || falseОтже, це була хитра частина, тепер true || falseоцінюється ( expr1- ліва сторона &&).
||оператор зупиняє виконання, якщо expr1 || expr2in expr1вважає істинним, expr1виконується і виконання коду.Повернене значення: true
Ну .. це було досить складно, все через кілька дивних правил та семантики. Але пам’ятайте, ви завжди можете уникнути переваги оператора за допомогою ()- так само, як і в математиці
function a() { console.log('a'); return true;}
function b() { console.log('b'); return false;}
function c() { console.log('c'); return false;}
console.log((a() || b()) && c());
/* 1. The () escape && operator precedence
2. a() is evaluated as false, so expr2 (c()) to be executed
3. c()
*/
expr1і expr2 чи condition1або незалежно від того , що це просто помилка. Визначтесь з одним, ви також можете ввести локальні змінні, наприклад. const expr1 = true; if(expr1 && ...)
https://www.google.com/search?q=site:stackoverflow.com+%sяк ярлик пошуку (Chrome / Firefox), щоб пришвидшити пошук.