js не знаю, и категорически не понимаю какого хрена оно работает, нужен кэп
Тоже не знаю, но предположу что по каждому обращению к переменной a, её значение увеличивается на 1, поэтому условный оператор возвращает true, что конечно нихуя не интуитивно.
js не знаю, но подозреваю что при каждом вызове a происходит инкремент переменной поэтому в первой проверке оно 3, а во второй 4.
мы используем нестрогое равенство из-за этого интерпретатор сначала попытается вызвать valueOf. но так как у нас он не реализован то он дергнет toString. При первом сравнении он вернет 3, ну а потом 4. =)
при сравнении вызывается переопределенный метод преобразование в строку, в котором значение переменной инкрементится.
при каждом сравнении значение переменной увеличивается.
js не знаю, но метод определенно говнокод.
Ну вообще-то, понимать такие приколы надо, но вот за попытки написать такое в продакшне точно так же надо ломать руки.
Всё дело в динамическом преобразовании типов, так как Object при нестрогом равенстве сравнить с Number не получится, интерпретатор пытается преобразовать тип в строку, с помощью toString, так как у объекта "a" есть уже определённый метод toString, получается что-то типа переопределения метода, то происходит инкрементирование каждый раз свойства value на единицу, ну а сравнение уже происходит с результатом выполнения метода toString.
Уж насколько я хейтер JS, можно было бы найти примеры реально всратого поведения, а тут все практически нормально, из ебанутого разве что приведение к строке, чтобы потом привести строку к числу, чтобы сравнить. А так побочные эффекты в методе приведения - ССЗБ. Такое можно сделать на любом языке, где есть оператор неявного приведения, например шарп или плюсы.
А ведь этим можно воспользоваться. Например для автоинкремента количества ссылок на объект. Конечно, правильнее это делать в конструкторе.
Еще и в операторе присваивания. И не просто можно, вовсю используют. shared_ptr
ЧТД
Скажи честно, ДжаваСкрипт держит тебя в заложниках?