Я хотів би знати, чи має 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, інакше я б повернув NaN
expr1
Повернув «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
є false
expr1
є true || false
Отже, це була хитра частина, тепер true || false
оцінюється ( expr1
- ліва сторона &&
).
||
оператор зупиняє виконання, якщо expr1 || expr2
in 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), щоб пришвидшити пошук.