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