Показать сообщение отдельно
  #2 (permalink)  
Старый 15.01.2016, 20:03
Профессор
Отправить личное сообщение для Яростный Меч Посмотреть профиль Найти все сообщения от Яростный Меч
 
Регистрация: 12.04.2010
Сообщений: 557

Сообщение от psihoz26 Посмотреть сообщение
пару примеров с alert(1)

1.
toString.constructor.prototype.toString=toString.call;["","alert(1)"].sort(toString.constructor)
изящный прикол.
объяснить несложно, но придумать такое я бы не смог

сначала для наглядности заменим toString.constructor на Function (это он и есть), и для большей наглядности toString.call на Function.prototype.call, чтобы не забыть откуда что берется:
Function.prototype.toString = Function.prototype.call;
["", "alert(1)"].sort(Function);


далее, при сортировке, поскольку элементов всего 2, callback сравнения будет вызван только один раз, и это будет вызов Function("", "alert(1)"), который в результате вернет функцию, делающую алерт(1).

Но результат этого callback'а надо сравнить с 0, для чего у него (результата Function("", "alert(1)")) вызывается метод valueOf(), который для функции просто использует toString().

И вот тут вспоминаем, что у функций теперь вместо toString реально используется call. Фактически мы делаем Function("", "alert(1)").call(), т.е. просто вызываем созданную функцию.
Ответить с цитированием