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

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

Небольшое напоминание: строгое равенство (===) оценивает истинность или ложность заданного условия. Например, 1 === 1 будет оцениваться как истина, тогда как «1» === 1 будет оцениваться как ложь («1» — это строка, а 1 — это число, т. е. не одно и то же). Истинное значение — это любое значение, которое НЕ является ложным, «», 0, -0, 0n, document.all, null, undefined или NaN.

Теперь к проблеме.

Задача называется «Реверс». Цель состоит в том, чтобы создать функцию, которая принимает строку и возвращает строку, перевернутую с противоположными регистрами для каждой буквы. Например, при задании «Hello World» функция должна выводить «DLROw OLLEh», «ReVeRsE» должно стать «» eSrEvEr», а «Radar» должно стать «RADAr».

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

Я знал о методах .toUpperCase() и .toLowerCase(), но планировал использовать их для изменения регистра. Так как же проверить дело? Я быстро написал функцию, чтобы увидеть, могу ли я использовать следующее условие:

Это утешало «с»; Я был взволнован. Я изменил ввод на «s», полностью ожидая, что он вернет «S». Он вернул «с»; Мне было грустно.

На самом деле я довольно быстро понял, что letter.toUpperCase() в условном выражении просто проверяет, является ли это истинным значением, и, учитывая то, что я обсуждал выше, оно всегда будет оцениваться как правдивое. Следовательно, буква всегда будет строчной, поэтому «S» стало «s», а «s» осталось «s».

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

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

Потом меня осенило. Существуют разные последствия для равенства и истинных ценностей.

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

Ah.

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

По мере того, как я продолжаю изучать программирование, мне всегда так интересно узнавать, как использовать базовые определения, такие как определение равенства. Я мог не только использовать методы .toUpperCase() и .toLowerCase() для изменения текущей буквы, я также мог использовать их для проверки того, является ли текущая буква прописной или строчной, если я делал это, используя равенство. Программирование постоянно учит меня думать по-новому, и я с радостью перечитываю эту статью через год и думаю: «Не могу поверить, что действительно создал эти два объекта алфавита, чтобы решить эту задачу».