Вы заявляете, что избегаете принуждения без причины!

Вы никогда не сможете понять всего. Но вы должны заставить себя понять систему.

- Райан Даль, создатель Node.js и Deno

Старый но золотой!

JavaScript - это самый неправильно понимаемый язык программирования в мире.

Абстрактные операции - это фундамент, но это не все возможности механизма JavaScript. Если вы хотите понять, как работает система, вам следует изучить другой набор концепций. Сделайте глубокий вдох и не бойтесь принуждения.

Начнем с простого. Я приведу несколько примеров, в которых вы можете угадать (или нет) JS-принуждение. Мы возвращаемся в 2015 год (ES6) - год возрождения JS! ES6 выделяет некоторые выдающиеся особенности, связанные с принуждением.

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

Согласитесь, это утомительный процесс. В настоящее время мы стараемся быть крутыми и делаем следующее:

Я делаю это все время! Когда я работаю с React.js, это огромное облегчение. Вы когда-нибудь задумывались, что происходит под капотом? Происходит принуждение. Если вы ненавидите неявное принуждение и используете строку шаблона, остановитесь на этом! Я просто шучу. Видите ли, вы не можете быть опытным разработчиком, не понимая неявного принуждения.

Не полагайтесь только на неявное принуждение, постарайтесь понять это. Вы должны подумать о правильной ментальной модели и о том, что происходит, когда мы берем строку str1 и добавляем ее к числу .

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

Это было неожиданное поведение. В конечном итоге это приводит к его натяжению. Если мы проверим спецификации, мы увидим, что join () сначала превращает его в строку. Это классная функция, но я не рекомендую ее использовать. Если вы хотите быть более явным, используйте метод toString:

Вы можете указать здесь явно, используя toString (). Этот метод превратит число в строку. Имейте в виду, что метод toString () не принадлежит к примитивному типу. За кулисами есть несколько мощных операций, которые позволяют нам использовать эти методы с примитивными типами (подробнее об этом позже). Но есть способ избежать принуждения в этом конкретном случае - использовать фундаментальный объект. Давайте посмотрим на пример:

Я тебя напугал, я знаю. Мы объясним принуждение немного позже, не волнуйтесь. Вам хорошо известен следующий пример:

Итак, мы здесь имитируем ввод, который всегда находится в строковом представлении. О нет, у нас есть веревочка. Вы этого ожидали? Две строки объединяются, и в результате получается «34». Итак, вместо числовой операции произошла конкатенация строк. В этих случаях мы можем выполнить явное принуждение и присвоить ему число.

Я собираюсь показать вам отличный трюк для принудительного явного принуждения:

Используйте знак «+» перед строкой и принудительно выполните абстрактную операцию ToNumber. Просто, не правда ли? Абстрактная операция сначала преобразует его в число, а затем передаст его в качестве аргумента. В конце концов, результатом будет число, а не строка. Если мы дадим пустую строку, она будет приведена к нулю.

Мы можем быть очень явными и использовать фундаментальный объект - Number (). Использование основных объектов - предпочтительный способ большинства разработчиков JS. Вы, наверное, уже представляли себе этот случай, но я все равно его напишу:

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

Мы должны быть очень осторожны с логическими значениями. Угловых случаев очень много. Если мы попадём в ловушку, пути назад нет. Прежде чем продолжить, проверьте, не пуста ли строка. А вот и наихудший сценарий: строка с массой белого пространства внутри.

Еще одна распространенная практика - проверить длину массива:

Людей привлекает числовое приведение числа к логическому значению. Мы знаем эту историю. Если значение равно нулю, вернуть false, в противном случае вернуть true. Здесь мы полагаемся на ненулевое значение, которое всегда возвращает истину.

Это может звучать безумно, но что, если у вас есть NaN. Не могу дождаться, чтобы проверить это на примере:

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

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

Двойные переговоры спасут положение! Я говорю здесь, чтобы сначала стало логическим, а затем все остальное.

Вы можете более четко указать массивы, чтобы:

Иногда использование принуждения при работе с массивами может быть фатальным. Более того, это более семантический, чем проверка истинности значения. Самое главное - это защита от угловых корпусов. В конце концов, наиболее влиятельный план - использовать фундаментальный объект. Давайте посмотрим на пример:

Вывод: Будьте осторожны при работе с логическими значениями. Помните, что логическое значение пустой строки всегда ЛОЖЬ, а логическое значение непустой строки - ИСТИНА. В конце концов, будьте откровенны, насколько можете. Неизвестность - это не вариант!

Когда мы думаем о примитивных типах, мы можем легко избежать угловых случаев. Но как насчет объекта и объектно-подобных типов? Давайте посмотрим на примере:

У нас ожидаемая ситуация. Undefined и null - ожидаемая ложь, но как насчет объекта? С объектами все складывается неаккуратно, поэтому нам нужно быть очень осторожными. Есть способ избежать неудобств. Я собираюсь показать обычную практику изучения объектов:

Заключение: Неявное принуждение логических значений - хорошая практика. Вы должны иметь в виду некоторые угловые случаи. Иногда здравый смысл - не лучшая ментальная модель, попробуйте использовать JavaScript, и вы станете опытным JS-разработчиком.

Бонус: Как бокс экономит наше повседневное время?

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

Давайте разогреемся и начнем с примера:

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

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

В конце концов, это хорошая особенность, JS - это динамический язык, в отличие от Java или C #, где вы должны сначала преобразовать примитив в тип объекта, а затем сделать все остальное.

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

Надеюсь, вы нашли правильную ментальную модель. Я попытался приблизить эту историю (а также предыдущие истории) и объяснить некоторые концепции. В более широком смысле, вы не можете «убежать» от принуждения, и вам не нужно этого делать. Во всех языках программирования есть принуждение, и это естественно.

Вывод: Для JavaScript было два пути. Либо реализуйте бокс (что делает), либо выдает ошибку при попытке доступа к свойству с примитивным значением.

Примечание от In Plain English

Вы знали, что у нас четыре публикации и канал на YouTube? Вы можете найти все это на нашей домашней странице plainenglish.io - проявите немного любви, подписавшись на наши публикации и подписавшись на наш канал YouTube!