Значит, вы пытаетесь изучить JavaScript, но сталкиваетесь со множеством разнообразных синтаксисов и способов программирования, которые со временем эволюционировали?

Почему этот код завален обратными кавычками? Что это за загадочные стрелы, они похожи на чьи-то смайлики? 3 точки, что за что?

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

В среде, где знания - сила, мы всегда как хомяки на обучающей беговой дорожке, просто пытаемся опередить всех остальных, чтобы не выглядеть глупыми перед своими сверстниками. Этот недостаток (моих) знаний стал очевиден недавно, когда я присоединился к клиентскому проекту, состоящему в основном из кода JavaScript. Я думал, что знаю JavaScript. Я был совершенно неправ.

Вы говорите: «Разве вам не нужно использовать ключевое слово function для объявления функций?» (потому что об этом сказано в том блоге / видео, которое вы читали / смотрели на днях); «Идиот - как ты не знаешь о стрелочных функциях. Пшшоу! » злорадствует коллега.

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

Итак, я даю вам это руководство для блефа, которое поможет вам прожить день. Изюминка синтаксиса JavaScript, представленного в ES2015 +, который все дети используют в наши дни, а также некоторые не очень известные функции JS. Это поможет замаскировать неловкие моменты, когда вы понимающе киваете и вежливо меняете тему.

Прежде чем вы заплачете: «О, Грег, дурак, ты создал статью, которая является TLDR, где я найду 15+ минут, чтобы прочитать твою статью». Во-первых, я осознаю эту боль от нехватки времени в жизни, поэтому сочувствую. Во-вторых, статья разбита на разделы, посвященные определенному синтаксису, поэтому, если вас не интересуют стрелочные функции, пропустите ее. Не уверен насчет шаблонных литералов, тогда побудьте около 2–3 минут, друг, и позвольте мне рассказать вам все об этом. Необязательно просматривать статью целиком за один раз!

Я не пытаюсь скрыть, что эта статья предназначена для тех, кто изучает JavaScript и имеет базовые знания о том, как работает JavaScript! Чтобы эта статья была вам полезна, вы должны знать, как писать JavaScript (например, только основы функций, объектов и т. д.). Если нет, посмотрите другие мои сообщения о JavaScript и / или при необходимости дополните их видеоуроком по основам JavaScript.

Кроме того, в этой статье в основном объясняется использование синтаксиса, представленного в ES2015 и выше, который может поддерживаться не всеми браузерами. Используя Babel, большую часть синтаксиса можно скомпилировать для совместимости. Для других, таких как Set или includes (), вы можете использовать полифил, но это выходит за рамки данной статьи. Всегда сверьтесь с таблицами совместимости браузеров, с требованиями к поддержке браузеров в ваших проектах и ​​со своим техническим руководителем (-ями), чтобы представить что-то новое.

var - для болванов; let и const - это будущее

let и const - новые объявления переменных, представленные в ES2015. Разница между ними и var заключается в основном в области видимости переменных.

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

И я даже не говорил (и не буду) о путанице с подъемом.

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

Одна вещь, которую следует знать о const, заключается в том, что он неизменен только в своем назначении. Это нормально для примитивных типов, таких как String или Number. Объекты ведут себя немного иначе; ссылка на объект неизменна, но их свойства по-прежнему изменчивы.

Что вам следует использовать? Ну, определенно не var. Существуют разные мнения о том, использовать ли let или const. В конечном итоге все сводится к личному мнению или условностям проекта. Я подписываюсь на использование const (вопреки моим примерам кода) из-за его неизменности (помимо свойств объекта).

Если вы сейчас видите var в коде, первым объявите, как можно улучшить качество кода, заменив на let и const, и прекратить их использовать прямо сейчас. Период.

Сокращенное обозначение инициализации объекта - экономия драгоценного времени

Я собираюсь поделиться с вами информацией, которая сэкономит вам несколько секунд драгоценного времени. Ценное время; Предоставляя вам возможность заниматься тем, что вы любите (или ненавидите). Дополнительное белье для стирки, еще одно «Кстати» в следующий раз, когда вы будете болтать над офисным кулером, дополнительное время, чтобы сесть и расслабиться перед дневной схваткой и т. Д.

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

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

Однако вы должны использовать эту нотацию с умом и не быть несчастным инженером, который пытался использовать ключевые слова или дубликаты в вашей функции. Первый вызовет ошибки, а второй (и, возможно, хуже) просто заменит ваши значения последним значением аргумента.

Шаблонные литералы - крутой кот конкатенации

Шаблонные литералы (также известные как шаблонные строки) позволяют ссылаться на переменные внутри строк без всякой суеты явной конкатенации, используя обратную кавычку . Пользователи Slack и Medium сразу же ознакомятся с символом `, обозначающим разметку кода.

Возьмем этот стандартный пример конкатенации:

Тьфу, усилие. Вы можете сделать код более эффективным с помощью шаблонных литералов:

Мы даже можем использовать его для замены ужасного escape-символа новой строки \n без необходимости в дополнительном коде.

Мы также можем выполнять вычисления и выражения (известные как интерполяция выражений) внутри литерала шаблона, не нарушая нашу «строку»:

И мы можем сделать несколько забавных шаблонных литералов вложения:

Шаблонные литералы - это пресловутая конкатенация JavaScript. Я обнаружил, что в рабочих проектах он настроен по умолчанию для правил линтинга, так что явная конкатенация автоматически преобразуется в литералы шаблона. Не ждите особого праздника, поразите друзей прямо сейчас новообретенным синтаксисом конкатенации.

Параметры по умолчанию - полностью экипирован

Как и многие другие элементы этого нового синтаксиса кода, я увидел параметры по умолчанию еще до того, как узнал о их существовании. Конечно, читая код, я был озадачен и немного апоплексичен по поводу того, почему определенное значение, которому присваивается значение, не было этим значением во время выполнения. Это было чертовски 5 - прямо в параметре функции написано, как это могло быть 10 во время выполнения! Проклятый код гремлинов. Конечно, этот моментальный приступ шипения был просто невежеством с моей стороны.

Параметры по умолчанию позволяют вам использовать, как вы уже догадались, параметр… по УМОЛЧАНИЮ! Как бы я ни высмеивал это, на самом деле это простое (как пощечина по лбу, чтобы уговорить мозг проснуться простым), но эффективное средство управления непредсказуемостью undefined входа в ваш функциональный контракт.

Например, большинство разработчиков программного обеспечения на разных языках на каком-то этапе видели if(something != null) (глядя на вас, Java) вокруг блоков кода просто потому, что всегда есть 1% шанс, что наш враг передаст объект или значение это не то, чего мы ожидаем, и мы должны принять это как абсолютную уверенность, что они это сделают.

Представьте, что у вашего банковского счета есть функция, которая однажды получила undefined. Я предполагаю, что потребуется хирургическое вмешательство, чтобы снова прикрепить челюсть после того, как она упала с вашего лица, если вы увидели баланс своего аккаунта как NaN.

Так как защищаться? Правильно - параметры по умолчанию.

Просто, но эффективно.

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

Параметры по умолчанию защищают от undefined, поэтому вы правы, когда думаете: «что, если введен непредвиденный тип значения - параметры по умолчанию не защитят от этого». Действительно, это так, и в зависимости от вашего кода вам могут потребоваться дополнительные проверки, чтобы убедиться, что тип значения правильный.

Деструктуризация - волшебство присвоения значений

Когда я впервые увидел деструктурированные объекты (не зная, на что смотрю), я был сильно сбит с толку. Фигурные скобки, которые я связал с обозначением объекта, но в объявлении имени переменной с кучей других имен, указывающих на одну ссылку на объект? Действительно темное волшебство.

Реальность такова, что это довольно просто, но от его использования вы будете выглядеть таким волшебником, что даже Гарри будет ревновать. Идея такова: вы объявляете непосредственные переменные со значениями, которые соответствуют одноименным свойствам объекта.

Больше никаких someObject.someProperty; только простых переменных для наших дальнейших потребностей программирования.

Что произойдет, если переменная недоступна или нам просто не нужны все переменные? Что ж, мы можем создавать переменные только для тех значений, которые нам нужны, и если мы объявляем переменную, которой нет в объекте, мы просто получаем то же значение, как если бы мы обычно объявляли переменную без определения: undefined

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

А при желании мы даже можем переименовать переменные, как захотим. Действительно колдовство.

И пока это объект, который вы деструктурируете, не имеет значения, был ли он деструктурирован напрямую или передан как возвращаемый объект функции.

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

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

Приведенные выше примеры деструктуризации являются хорошим резюме того, что вы можете сделать, но если вы действительно хотите стать Гэндальфом деструктуризации JavaScript, то ознакомьтесь с документацией по назначению деструктуризации MDN.

For..of loop - итеративное повторение итераций

Цикл for..of в JavaScript позволяет более эффективно выполнять итерации. Часто люди думают об итерациях как о массивах (и они, конечно, правы), но итерируемые объекты также могут быть символами в String, парами ключ-значение в Map, элементами Set и т. Д. (Pssshhh - см. Больше Iterable типа здесь).

Вы можете подумать, в JavaScript нет других циклов for, и будете правы - они есть; традиционные for, for..in, while и do..while, forEach и map. Так что же особенного в for..of?

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

Разница более очевидна в строках.

Так зачем возиться с другими for петлями, хорошо вооруженными артиллерией for..of? Ну, for..of не допускает мутации (т. Е. изменения) массива, как for. Кроме того, он плохо работает со свойствами таких объектов, как for..in.

Я нашел различные способы зацикливания в JavaScript, в том числе for..of , но большинство моих применений было удовлетворено использованием map, filter и reduce, которые являются итеративными, и которые я опишу ниже.

Скорее всего, for..of будет наименее полезным для вас в этом списке, но по крайней мере произведет впечатление на других своими знаниями.

Массив включает - для меня нет индексации

В рабочем проекте я видел, как indexOf используется для проверки значения в массиве. У него также была проверка на -1, чтобы убедиться, что есть логика, которую нужно обработать, если она не будет найдена - if(array.indexOf(b) < 0) {..}. В одну из моих редких вспышек вдохновения я подумал, что, поскольку я видел весь этот новый синтаксис, который описываю в этой статье, несомненно, некоторые хитрые сбои сделали его более простым и читаемым! Конечно. И я был прав.

Array.prototype.includes() позволяет более наглядно и логично проверять, имеют ли определенные массивы определенные значения. Он возвращает простое логическое значение, а не какое-то значение контрольного числа, и в целом оно должно быть де-факто для опроса массива.

Одно предостережение - этот рабочий проект, над которым я работал, должен был поддерживать IE11 в качестве браузера. И угадай что? Для браузера, который не умрет, он не поддерживается. Для тех, кому приходится работать в таких драматических условиях, доступен полифилл.

Набор - Разнообразие на рабочем месте

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

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

Набор имеет набор функций, таких как add, delete, forEach и т. Д., Которые позволяют вам перемещаться по рассматриваемому набору и манипулировать им.

Распространение - распространение любви к ценностям

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

Синтаксис оператора Spread - три точки (…) перед ссылкой на объект.

Оператор Spread по существу разворачивает итерируемый объект, содержащий значения, и помещает их в пространство, где ожидается несколько значений (по значению, а не по ссылке). Все еще не понимаете? Это нормально - давайте разберемся дальше.

Давайте объединим несколько массивов в массивы большего размера.

При использовании спреда эти объекты передаются по значению, а не по ссылке. Это означает, что мы можем изменить исходный массив, не беспокоясь о том, что составной массив изменится.

Итак, теперь это кажется очевидным, что вы можете по существу составлять массивы, такие как блоки Lego из других массивов. Это нормально, но что еще?

Well Spreads можно использовать в списках аргументов функций.

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

Итак, массивы, проверьте. Аргументы функции, проверьте. Спред - это здорово, не правда ли? Что ж, у него есть еще один прекрасный сюрприз, который он действительно хочет вам показать - распространение литералов объектов!

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

Одно предостережение; распространение объектных литералов является более передовым (на момент написания), чем другие функции синтаксиса здесь (представленные в ES2018).

Для получения дополнительной информации о Spread и общей поддержке браузером этого распространения см. Статью MDN о синтаксисе Spread (особенно таблицу совместимости браузеров).

Оператор отдыха - Принятие всех остальных

Если вы понимаете синтаксис Spread, это должно показаться естественным расширением его функциональности. Если вы работаете с Java, я просто скажу varargs, чтобы вы могли быстро двигаться дальше.

Оператор Rest - это синтаксис, который позволяет ссылаться на любое количество аргументов, переданных в функцию. Он позволяет функциям принимать столько аргументов, сколько вы хотите им передать (при условии, что оператор Rest является единственным и последним аргументом функции). Я считаю его имя ссылкой на все остальные аргументы, которые должна использовать функция.

Вот и все. Простые.

Подождите, а как насчет arguments? Почему бы не использовать это? Что ж, arguments - это забавно, потому что он возвращает не массив, а объект, подобный массиву. Из-за этого мы не можем рассматривать его как массив.

В большинстве случаев вы не хотите, чтобы ваши функции принимали столько аргументов, сколько некоторые хулиганские инженеры захотят выдать. Это может привести к непредсказуемости; честно говоря, работа достаточно сложная, но без дополнительной сложности. Будут случаи использования, когда, конечно, вам нужно быть открытым для всего (например, функция sum), и когда это произойдет, оператор Rest - это то, что вам нужно.

Стрелочные функции - прямо к функциональной точке

В настоящее время я вижу все больше и больше кода, в котором используются стрелочные функции, а не традиционный синтаксис function. Лично я получил опыт работы с Java, которая, как правило, известна своей многословностью, поэтому я вполне естественно впадаю в этот стиль. Знание функций стрелок будет иметь большое значение для того, чтобы обмануть навыки JavaScript среди ваших коллег, завоевать друзей и повлиять на людей.

Стрелочные функции упрощают традиционный синтаксис функций, делая их менее подробными и более короткими для реализации. Конечно, между ним и выражениями функций есть незначительные различия (например, no this, super или arguments), но в целом это приемлемый компромисс.

В однострочниках, подобных приведенному выше, мы не только избавились от ключевого слова function, мы также смогли избавиться от фигурных скобок и ключевого слова return. Это называется «кратким текстом». Конечно, вы все еще можете использовать фигурные скобки для многострочной логики, известной как «тело блока».

Стрелочные функции эффективно подходят для использования в обратных вызовах.

Да, да, я знаю, приведенный выше код можно было бы упростить, как чешую элегантной рыбы, чтобы сделать однострочным; но если бы я сделал это, я бы не смог показать многострочную стрелочную функцию!

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

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

Так что выходите и пускайте стрелы повсюду; Направляйте стрелки на все функции вашего друга; это еще больше очарует всех, кто владеет JavaScript. Станьте точнее лучника, а для уроков мастер-класса - см. Документацию MDN по функциям стрелок.

Вычисляемые имена свойств - не вычисляются?

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

Один из доступных инструментов - использовать обозначение квадратной скобки. Его можно использовать для доступа к свойствам объекта, как и его враг, оператор точка. Например, person['name'] это то же самое, что person.name.

Мы также можем использовать тот же синтаксис для установки свойств объектов, используя их значение в качестве ключа.

Что еще лучше, так это то, что с ES2015 это стало намного проще! Больше не нужно возиться с созданием объекта, затем назначать значение и другие вещи, тьфу, как беспорядок. Просто установка пары "ключ-значение". Какое облегчение.

Карта, фильтр, уменьшение - не картография

Я поздно пришел к игре, изучая map, filter и reduce, и, что еще хуже, это не новый или современный синтаксис.

Я использовал типичный синтаксис цикла (например, for) из фона Java. Это означает, что когда мне приходилось просматривать элементы в массиве, я часто создавал новый пустой массив, опрашивал оцененный массив и передавал нужные мне элементы.

Такие напрасные усилия. К счастью, есть более приятные способы завершить эти испытания.

Мне нравится думать об использовании map, когда мне нужно:

  • Мне нужно преобразовать содержимое массива
  • Я возвращаю новый массив

Итак, что я имею в виду под преобразованием? Что ж, это хороший вопрос, можно было бы манипулировать содержимым массива любыми способами. Например, если я хочу удвоить числа в числовом массиве или (что более практично) создать кучу HTML-элементов со значениями из массива String.

Как правило, map подходит для большинства обнаруженных мною потребностей в циклах, а также сохраняет неизменность исходного массива, возвращая новый массив, что прекрасно. В большинстве случаев это мой способ зацикливания по умолчанию.

filter, как следует из названия, фильтрует массив и возвращает новую копию этого массива (конечно, отфильтрованную). Во многих отношениях очень похож на map, с той лишь разницей, что обратный вызов должен возвращать логическое значение (чтобы указать, следует ли сохранить значение или нет). Волшебный!

Наконец, reduce - это акт уменьшения вашего массива до одного значения (насколько дедуктивно с вашей стороны). Как ни странно, я не видел особого применения этих внешних чисел, кроме конкатенации строк и т. Д. Но эй, если это правильный инструмент для правильной работы, тогда кто я такой, чтобы спорить.

reduce немного отличается от map и reduce тем, что принимает значение аккумулятора или предыдущее (представляющее итоговое значение на данный момент) и текущее значение .

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

А как насчет предметов? Ну, ты можешь… вроде как. Reduce может принимать исходный объект, добавлять свойства и значения. Как было сказано ранее, я лично не видел много вариантов использования, кроме подсчета количества раз, когда объект находится в массиве, и последующего присвоения значений счетчика возвращаемому объекту. Итак, с этой бомбой….

Что замечательно в map, filter и reduce, так это то, что они являются функциями массива, и, поскольку все они возвращают массивы, это означает, что они могут быть связаны друг с другом, один за другим. Действительно мощная штука.

Классы - как оставаться стильным

Для тех, кто читал мою другую статью Дайджест ООП в JavaScript, или тех, кто испытал радость React (да, я сказал это), классы не являются незнакомыми. Однако что было для меня сюрпризом, перескочив на React до понимания современного JS, было то, что синтаксис class был продуктом ванильного JavaScript, а не библиотекой или фреймворком.

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

Поэтому, прежде чем беспокоиться о сложности классов, необходимо знать простое удобство: объектно-ориентированная прототипная модель JavaScript не изменилась. Небо поднялось, а земля опустилась для тех из нас, кто еще несколько вертикален. MDN определяет классы как синтаксический сахар по сравнению с существующим наследованием на основе прототипов в JavaScript и прекрасный способ сказать - это просто еще один способ создания объектов (подсказка: 'объектно-ориентированный ').

Традиционно мы использовали function для создания объектов в JavaScript, и, конечно, мы все еще можем. Но классы безопасно заменяют идею использования function Dog() {} для создания объектов, устраняя путаницу вокруг функций, которые, в общем, являются функциями, и теми, которые используются в режиме конструктора.

Это достигается путем принудительного использования ключевого слова new. Раньше, когда функция, которая на самом деле была функцией-конструктором (т. Е. Необходимая new) вызывалась старомодным способом, свойства фактически устанавливались для объекта вызываемого, что, конечно, приводило к возникновению столпотворения.

Есть еще ряд функций классов, которые следует учитывать:

  • Конструкторы

Конструкторы могут использоваться для инициализации объекта и имеют зарезервированное СОБСТВЕННОЕ ключевое слово.

  • Функции объекта

Раньше, если мы хотели, чтобы объект «тип» содержал функцию, доступную для всех этого типа, мы устанавливали ее на прототипе этого объекта. Трудно. Теперь мы можем просто добавить его в класс.

  • Геттеры / сеттеры

Классы могут использовать ключевые слова get и set в качестве средств доступа / мутаторов для доступа к переменным в классе. Как правило, классы не могут содержать переменные экземпляра, объявленные на уровне класса (как Java), но могут содержать стандартные свойства объекта, определенные и извлекаемые с помощью функций. Примечание. Наше _ соглашение об обозначении чего-либо частного не является частным в JavaScript и доступно.

  • Наследование

Наследование очень похоже на тех, кто имеет опыт работы с такими языками ООП, как Java. В самом простом варианте он позволяет передавать функции от родительского типа к дочернему типу. Очевидно, до ES2015 это было довольно утомительно.

Чтобы упаковать вас в путь для получения дополнительной информации - я бы полностью порекомендовал статью в Синтаксис классов JavaScript ES6 от Кори Рилана, которую я нашел наиболее поучительной для мира классов JavaScript. Он быстрый и полон хороших (r) примеров кода, сравнивающих старый и новый синтаксис JavaScript.

Резюме

Итак, вооружившись (втайне, конечно) этим руководством для блефующих, вы должны вызывать зависть у своих друзей, бояться врагов и быть на пути к повышению уровня со всеми вашими новообретенными очками опыта JavaScript.

Эта статья была длинной, да, я не извиняюсь за свою бардовскую артикуляцию. Однако вы можете предложить другой, более жестокий контраргумент; так что, если бы я предлагал минимальный набор решений - сосредоточьтесь на let / const, стрелочных функциях, распространении и деструктурировании.

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

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

Если вам не понравилась эта статья и вы хотите выразить свое недовольство, вы можете сделать это, похлопав в ладоши с ненавистью.

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