В это статье описывают только "симптомы" поведения. по настоящему если хотите узнать почему 1+"1"="11" то узнайте про:
- Прототипы
- Проиотипная модель наследования
- "Дефолтное" поведение методов для приведения типа в другой тип
- Изменение "дефолтного" поведения методов в рамках типа или экземпляра этого типа.
А ещё можете почитать про JsFuck Она покажет на реальных примерах приведение типа. Для примера: Как только с помощью таких символах как []()!+ Получить строку со значением 'e'?
Ответ: (!![]+[])([!+[]+!+[]+!+[]])
Объяснение: Разберемся с первой группой (скобки) Начнем с пустого массива. Если вызвать пустой массив то логично получим этот пустой массив. Но что будет если попробовать использовать унарный оператор НЕ (!)? выведет false. Почему? Потому что при попытке приведения Exotic Object Array в Boolean type мы получаем true. А унарный оператор "разворачивает" вычисленное значение. и поэтому делаем еще один ! чтобы получить true.
Следующее: Почему потом !![] (как мы уже выяснили это true) это все снова прибавляется к массиву. При попытке Boolean прибавить Exotic Object Array неимеющим свойтсв срабатывает специальный метод прописанный в js и который описан в актуальной спецификации (как и все что я здесь говорю) и который в итоге возвращает пустую строку "". В итоге: true+""="true". Все это нужно было для того чтобы получить строку со значением "true" чтобы потом получить уже по индексу только строку со значением e.
Сокращая мы можем сделать так: (!![]+[])[3] Но нам нельзя использовать числа, так что надо сделать по другому. Зная что мы можем получить true то несложно предположить что 1 это true а 0 это false. И как же получить 1? надо использовать оператор "присвоения" (в спецификации он описан как Addiction expression если не ошибаюсь) То есть делаем: +(!![]) В итоге получается 1 а 1+1+1=3 так что надо просто повторить его 3 раза и получим строку со значением e