Что есть истина?

У нашего бывшего сотрудника в фейсбуке увидел ссылку на любопытную задачку — может ли (a == 1 && a == 2 && a == 3) быть «истиной» в ДжаваСкрипте?

Не заглядывая в статью, я предложил два варианта, вполне очевидный первый:

a = ((counter) => ({valueOf:() => ++counter}))(0)
// {valueOf: ƒ}
a == 1 && a == 2 && a == 3
// true

И второй — на суррогатных парах. Но по ссылке есть ряд других занимательных способов — через геттеры, похожие символы Юникода (мне приходил в голову такой вариант, но я не смог подобрать три символа, одинаковых на вид), другие специальные методы и прочее. Больше всех мне понравился такой способ:

a = [1,2,3];
a.join = a.shift;

a == 1 && a == 2 && a == 3
// true

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

Поделиться
Отправить
2 комментария
Павел

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

Евгений Степанищев (bolknote.ru)

Комментарий для Павел:

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

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

Популярное