Я хотел бы знать, есть ли в JavaScript оценка «короткого замыкания», такая как && Operator в C #. Если нет, я хотел бы знать, есть ли обходной путь, который имеет смысл принять.
javascript
short-circuiting
Гиббок
источник
источник
https://www.google.com/search?q=site:stackoverflow.com+%s
в качестве ярлыка поиска (Chrome / Firefox) для ускорения поиска.Ответы:
Да, JavaScript имеет оценку «короткого замыкания».
Живая ДЕМО
Живая ДЕМО
источник
Short-circuit
с этим логическим оператором. Просто попробуйте сами. Воспользуйтесь моей демонстрацией.Этот ответ очень подробно описывает, как короткое замыканиеработает в JavaScript, со всеми подводными камнями, а также соответствующими темами, такими как приоритет операторов, если вы ищете быстрое определение и уже понимаете, как работает короткое замыкание, я бы рекомендовал проверить другие ответы.
Что мы (думали, мы) знали до сих пор:
Сначала давайте проверим поведение, с которым мы все знакомы, внутри
if()
блока, где мы используем,&&
чтобы проверить, есть ли две вещиtrue
:Теперь ваш первый инстинкт, вероятно, скажет: «Ах, да, довольно просто, код выполняет оператор, если оба
expr1
иexpr2
оцениваются какtrue
»Ну да и нет. Вы технически правы, это поведение, которое вы описали, но это не совсем то, как оценивается код, и нам нужно вникнуть глубже, чтобы полностью понять.
Как именно это
&&
и||
интерпретированы ?:Пора заглянуть "под капот" javascript двигатель ". Рассмотрим этот практический пример:
Ну результат
260
... но почему? Чтобы получить ответ, нам нужно понять, как работает оценка короткого замыкания.Это означает, что в нашем практическом примере,
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
будет оценивать правдивое выражениеВот еще несколько примеров для лучшего понимания:
И последняя надоедливая, но очень важная вещь [приоритет оператора]:
Отлично, надеюсь, вы уже освоились! Последнее, что нам нужно знать, это правило приоритета операторов, а именно:
&&
Оператор всегда выполняется до||
оператора.Рассмотрим следующий пример:
Это вернет as, что, возможно, сбивает с толку некоторых as
a()
. Причина очень проста, это просто наше зрение обманывает нас, потому что мы привыкли читать слева направо. Давайте возьмем то,console.log()
что нельзя, и сосредоточимся исключительно на оценкеТеперь, чтобы обдумать это:
Мы сказали, что
&&
оператор имеет приоритет, поэтому он оценивается как первый. Чтобы лучше представить себе оценку, придумайте определениеКуда:
expr2
являетсяfalse
expr1
являетсяtrue || false
Итак, это была сложная часть, теперь
true || false
она оценивается (expr1
- левая часть&&
).||
оператор прекращает выполнение, еслиexpr1 || expr2
inexpr1
оценивается как истинное,expr1
выполняется и выполнение кода останавливается.Возвращаемое значение
true
Что ж ... это было довольно сложно из-за нескольких странных правил и семантики. Но помните, что вы всегда можете избежать приоритета оператора с помощью
()
- точно так же, как в математикеисточник
expr1
иexpr2
илиcondition1
или независимо от того , что это просто заблуждение. Во-первых, вы можете ввести локальные переменные, например.const expr1 = true; if(expr1 && ...)