Понимание преобразования типов и обратно

JavaScript временами может давать самые неожиданные результаты. Например, вы могли слышать раньше:

Или что ('b' + 'a' + + 'a' + 'a').toLowerCase(); возвращает« банан ». Это лишь некоторые из, казалось бы, бессмысленных результатов, которые может дать JavaScript. Однако JavaScript может больше. Похоже, вы действительно можете написать код всего с шестью разными символами. Вот эти персонажи:

! ( ) + [ ]

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

Производство 0 с тремя персонажами

Давайте сделаем шаг назад и начнем с 0. Как можно записать 0 с помощью указанных выше символов? Этого можно добиться относительно легко, используя только три из них: +[]. Но почему пустой массив со знаком плюс превращается в 0? Оператор унарный плюс, стоящий перед пустым массивом, попытается преобразовать свой операнд в число, если оно еще не было. Ложные значения приведут к 0. Например, +false или +'' также оцениваются в 0. Точно так же, как +[].

Производство 1 с пятью персонажами

Это означает, что мы можем превратить логическое true и некоторые другие истинные значения в единицы. Следовательно, чтобы использовать тот же набор символов, нам нужно преобразовать пустой массив в значение true. Мы знаем, что ![] приводит к false. Двойным отрицанием пустого массива мы можем превратить его в true:

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

Хорошо, теперь мы можем производить нули и единицу. Но как получить больше цифр?

Создание любого числа с шестью разными символами

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

И это могло сработать. Однако это намного больше персонажей, чем нам нужно. Есть более простое решение. Обратите внимание, что в самом начале операции нет знака плюс. Вам это не нужно из-за преобразования типов. По сути, вы пытаетесь сложить true значений, и из-за унарного оператора плюс они автоматически преобразуются в число:

Мы также можем сделать это со строками, однако вместо этого символы объединяются:

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

Однако, если мы попытаемся связать их с унарным оператором плюса, мы получим только 6, поскольку они уже являются числами, но нам нужны строки. Опять же, мы можем использовать пустые массивы в наших интересах. Если вы попытаетесь сложить массивы вместе, вы получите обратно строку, разделенную запятыми:

Это означает, что нам просто нужно добавить массив к числам, и мы вернем строку, например:

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

Оба они работают нормально, вы даже можете не переносить первое значение в массив, как мы это сделали в приведенном выше примере. Вам нужен только один массив, чтобы преобразование типов в JavaScript сработало. С этим вы, по сути, пишете 2 + [2], который объединит их и сделает их "22". Чтобы преобразовать его обратно в целое число, вам просто нужно еще раз использовать унарный оператор плюса. Но чтобы он действовал для всего блока, вам нужно заключить его в круглые скобки, и вы получите окончательную формулу:

Заключение

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

Это было создано с помощью jscrew.it. Если вы хотите поэкспериментировать с преобразованием типов, я настоятельно рекомендую заглянуть на сайт.

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