«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Джордж и Роберт заходят в бар...

Джордж и Роберт заходят в бар...

Опубликовано 1 августа 2024 г.
Просматривать:242

George and Robert walk into a bar...

Название может звучать так, будто вас ждет всего лишь шутка (я знаю, SEO-катастрофа). Извините, что разочаровал. Этот пост на самом деле посвящен операторам логического присваивания JavaScript, представленным в ES2021. Читайте дальше, чтобы узнать, какое отношение к этому имеют Джордж и Роберт...

Историческая справка

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

Во-первых, многие, если не большинство, разработчики могут не осознавать, насколько глубоко вплетена булева логика в ткань современных вычислений. Оно простирается от компьютерных схем до условных операторов в вашем коде.

Мы также используем знак равенства каждый день, часто не задумываясь об этом. Этот символ, который сейчас имеет решающее значение как в математике, так и в кодировании, был изобретен для математических целей еще в 16 веке. Примерно 400 лет спустя, в 1950-х годах, он нашел применение в компьютерном программировании.

Если этот исторический контекст не кажется вам ни капельки интересным, смело переходите к разделу «Понимание логических операторов присваивания». В противном случае присоединяйтесь ко мне в коротком путешествии назад во времени.

Джордж Буль

Самые ранние исследования логики приписывают древним грекам, в частности Аристотелю, которого часто называют «отцом логики». Он разработал формальную систему логики, которая заложила основу для использования логических операторов.

Настоящая математическая основа логических операторов, какими мы их знаем сегодня, начала формироваться с появлением символической логики в 19 веке. Он использует символы для представления логических форм и структур, что позволяет проводить более сложные и абстрактные рассуждения.

Джордж Буль, английский математик и логик XIX века, в своей основополагающей работе «Законы мышления» (1854 г.) представил алгебраический подход к логике. Здесь значения могут быть либо истинными, либо ложными, и над этими значениями можно выполнять операции, аналогичные алгебраическим операциям. Эта система включала в себя основные логические операторы:

  • И (союз)
  • ИЛИ (дизъюнкция)
  • НЕ (отрицание)

Опираясь на работы Буля, другие математики и логики расширили масштаб и глубину символической логики. А в середине 20-го века она нашла новую и благодатную почву в развивающейся области информатики. Бинарная природа булевой логики оказалась идеально подходящей для цифровых схем в основе компьютеров, где данные могут быть представлены в виде серии нулей и единиц, а логические операторы могут управлять потоком этих данных.

Логические операторы стали фундаментальной частью языков программирования, позволяя создавать сложную вычислительную логику и процессы принятия решений в программном обеспечении. Сегодня они являются неотъемлемой частью синтаксиса почти каждого языка программирования.

Роберт Рекорд

Знак равенства был введен в 1557 году валлийским математиком Робертом Рекордом в его книге «Точильный камень Витте». Рекорду надоело постоянно писать «равно» в своей работе, поэтому он выбрал две параллельные линии одинаковой длины в качестве символа равенства. По его словам, это произошло потому, что «две вещи не могут быть более равными». Это было значительным достижением в области математической записи, обеспечившим краткий и ясный способ выражения равенства.

На заре программирования, особенно с использованием машинного кода и языков ассемблера, концепция «назначения» больше касалась хранения и перемещения данных между регистрами и ячейками памяти. Инструкции давались с использованием определенных кодов операций, которые предписывали машине выполнять эти операции.

По мере разработки языков программирования высокого уровня возникла потребность в более абстрактном и удобочитаемом способе представления операции присвоения значений переменным. Это привело к принятию знака равенства в качестве оператора присваивания во многих языках, начиная с FORTRAN в 1950-х годах.

Использование = для присваивания создало некоторую двусмысленность с его математическим значением равенства. Это привело к введению различных символов для пояснения намерений в программировании:

  • Алгол, разработанный в 1960-х годах, ввел символ := для присваивания, в отличие от сравнения на равенство.
  • Позже C популяризировал использование = для присваивания и == для проверки на равенство, соглашение, которому следовали многие последующие языки.

Со временем в языках программирования появились различные формы операторов присваивания для эффективного выполнения различных операций, например, составные операторы присваивания (=, -= и т. д.) и, с недавних пор, операторы логического присваивания в JavaScript.

Понимание логических операторов присваивания

Логические операторы присваивания — это синтаксический сахар в JavaScript, который сочетает в себе присваивание (=) с логическим (&&, ||) или нулевым оператором объединения (??). Существует три типа:

  • Логическое присваивание И (&&=): присваивает значение справа переменной слева только в том случае, если левая переменная является истинной.
  • Присваивание логического ИЛИ (||=): присваивает значение справа переменной слева, только если левая переменная является ложной.
  • Присваивание нулевого объединения (??=): присваивает значение справа переменной слева, только если левая переменная имеет значение NULL или неопределена.

Логическое И Присваивание (&&=)

Оператор &&= — это ярлык для установки значения переменной, только если в данный момент она содержит истинное значение. Это особенно полезно в сценариях, где действие должно выполняться только в том случае, если определенное условие остается истинным.

Пример использования: переключение функций

Представьте себе сценарий, в котором определенные функции должны быть включены только для администраторов:

const isAdmin = user.isAdmin();
let canAccessDashboard = isAdmin;

canAccessDashboard &&= user.isAuthenticated();
console.log(canAccessDashboard); // true if user is authenticated, otherwise false

Этот фрагмент кода гарантирует, что canAccessDashboard имеет значение true только в том случае, если и isAdmin, и user.isAuthenticated() имеют значение true, эффективно защищая эту функцию с помощью двух условий.

Логическое присваивание ИЛИ (||=)

Оператор ||= позволяет присвоить значение переменной, если переменная в данный момент содержит ложное значение (например, ноль, неопределенное, 0, ложь, ""). Это невероятно полезно для установки значений по умолчанию.

Пример использования: установка значений по умолчанию

const userSettings = {
  theme: null,
};

// Set default theme if none is specified
userSettings.theme ||= "dark";
console.log(userSettings.theme); // Outputs 'dark'

Этот оператор идеально подходит для инициализации переменных, которые не были установлены, гарантируя, что ваше приложение использует разумное значение по умолчанию без перезаписи потенциально значимых ложных значений, таких как 0 или false.

Нулевое присваивание объединения (??=)

?? Оператор, известный как нулевой оператор объединения, появился относительно недавно в языках программирования. Это не логический оператор присваивания в строгом смысле слова, хотя спецификация ES2021 классифицирует его как таковой, поскольку он не основан на логическом операторе. Вместо этого его разработка более тесно связана с практическими потребностями программирования, особенно с обработкой нулевых и неопределенных значений чистым и предсказуемым образом.

Оператор ??= используется для присвоения значения переменной тогда и только тогда, когда переменная в данный момент имеет значение NULL или неопределена. Это более точно, чем оператор ||=, который также учитывает другие ложные значения.

Пример использования: настройки по умолчанию

const config = {
  timeout: 0,
};

config.timeout ??= 5000; // Set default timeout if not specified, i.e. undefined, or null
console.log(config.timeout); // Outputs 0, preserving the explicitly set falsy value

Этот оператор особенно полезен в конфигурациях и настройках, где значения по умолчанию должны только заполнять пропущенные значения, не заменяя другие ложные, но действительные настройки, такие как 0.

Практические преимущества и соображения

Использование операторов логического присваивания вместо операторов if или троичных операторов уменьшает объем кода, который вам нужно написать, и может прояснить ваши намерения другим разработчикам. Как и во многих других функциях, важно использовать эти операторы разумно, особенно при работе с ложными значениями, которые действительны в контексте вашего кода.

Дополнительное примечание

В JavaScript есть и другие операторы присваивания, например оператор присваивания сдвига влево (

(Обложка вверху от starline на Freepik)

Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/codejet/george-and-robert-walk-into-a-bar-413e?1 Если есть какие-либо нарушения, свяжитесь с [email protected], чтобы удалить ее.
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3