Что есть истина?
У нашего бывшего сотрудника в фейсбуке увидел ссылку на любопытную задачку — может ли (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
Очень просто и элегантно — массив при преобразовании в скаляр в ДжаваСкрипте, всегда сначала преобразуется в строку значених, объединённых через запятую. В коде выше метод для объединения заменяется методом, который забирает из массива первый элемент. И всё работает как требуется — при каждом сравнении массива с числом, забирается первый элемент массива.
А вот как ты считаешь — имеют ли право на жизнь такие конструкции где-то помимо программистских этюдов. Что бы ты сказал разработчику, использующему подобное в рабочем коде?
Надо ли вообще такое изящество в проде, или лучше писать незатейливый и сразу всем понятный код?
Комментарий для Павел:
Программирование — очень общий термин. Вопрос для меня звучит примерно как «нужно ли считать площадь квадрата интегралами и что бы ты сказал математику, использующему интегралы».
В данном случае это игра, развлечение и исследование различных граней языка. Играя в такое, тренируешь мозг и учишься глубже понимать язык, на котором программируешь. Как любая игра, эта уместна только как игра. В продакшне другие ценности (и другие меры изящества), там игры неуместны.