Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   СЛОЖНОЕ ВЫРАЖЕНИЕ? Что оно вернет и почему? (https://javascript.ru/forum/misc/23919-slozhnoe-vyrazhenie-chto-ono-vernet-i-pochemu.html)

Livanderiaamarum 12.12.2011 00:09

СЛОЖНОЕ ВЫРАЖЕНИЕ? Что оно вернет и почему?
 
(function pewpew(Infinity, length, __proto__) {
	return [,,~0.[0|0]][pewpew.__proto__.length && Infinity, -~String(this).length >> __proto__] << (0. === .0) + Infinity;
})

.apply(typeof pewpew, [,,2])


что вернет это выражение почему?
после return идут куча действий.. да и вообще что означает (0. === .0) + Infinity
расскажите пожалуйста кто кв курсе;)?

__________________________________________________ ____________________________

Gvozd 12.12.2011 00:30

Код обфусцирован, а значит, не предназначен для чтения человеком(по задумке автора).
Иными словами, автор взял свою нормально написанную прогу, и (посредством обфускатора) испортил ее читаемость, заменив обыденные конструкции на мене читаемые, и усложняющие анализ/редактирование кода.

Хотите ломать голову над этим кодом - ломайте свою, и не впутывайте других.

Про каждый маленький кирпичик этого кода, вы можете найти информацию на данном сайте, если внимательно почитаете документацию

Livanderiaamarum 12.12.2011 00:33

Цитата:

Сообщение от Gvozd (Сообщение 142109)
Код обфусцирован, а значит, не предназначен для чтения человеком(по задумке автора).
Иными словами, автор взял свою нормально написанную прогу, и (посредством обфускатора) испортил ее читаемость, заменив обыденные конструкции на мене читаемые, и усложняющие анализ/редактирование кода.

Хотите ломать голову над этим кодом - ломайте свою, и не впутывайте других.

Про каждый маленький кирпичик этого кода, вы можете найти информацию на данном сайте, если внимательно почитаете документацию


хоть одно обфуксирваонное место покажи. если ты в приоритете операторов не разбираешься или просто не способен понять что там напсиано то это уже твои проблемы а не обфуксация кода. я например все понимаю кроме (0. === .0)

B@rmaley.e><e 12.12.2011 00:49

(function pewpew(Infinity, length, __proto__) {
	return [,,~0.[0|0]][pewpew.__proto__.length && Infinity, -~String(this).length >> __proto__] << (0. === .0) + Infinity;
})

.apply(typeof pewpew, [,,2])
Возвращаемое значение разворачивается в
[,,~0.[0|0]][-~"unedfined".length >> 2] << (0. === .0) + Infinity;
[,,~0.[0|0]][2] << (0. === .0) + Infinity;
~0.[0|0] << (0. === .0) + Infinity;
-1 << (0. === .0) + Infinity;
-1;
Цитата:

Сообщение от Livanderiaamarum
я например все понимаю кроме

Рад за Вас. Но если вышенаписанное Вы считаете нормальным кодом, то работать вместе с Вами мне бы не хотелось.

Livanderiaamarum 12.12.2011 01:07

конечно не считаю это задание нам в инсте задали.;)

zebra 12.12.2011 01:12

Клац Раздел God Mode :) Лапшу не вешайте

Livanderiaamarum 12.12.2011 01:27

Цитата:

Сообщение от zebra (Сообщение 142117)
Клац Раздел God Mode :) Лапшу не вешайте

FFFFUUUU ну ладно ладно) просто не справился с год моде) решил тут посмотреть кто справится:)
да и в инсте не учусь)

devote 12.12.2011 01:38

вот жешь люди от жиру бесятся.

melky 12.12.2011 01:50

я написал тираду на листа 3 (а4)

но застопорился на одном

у меня __proto__ равен объекту CommandLineAPI

это как понимать ? __proto__ занята , как class и т.д ?

застопорился только на этом. остальное ок.

тираду оставлю на pastie. чтоб не пропадала зря:)

Livanderiaamarum 12.12.2011 01:53

Цитата:

Сообщение от melky (Сообщение 142121)
я написал тираду на листа 3 (а4)

но застопорился на одном

у меня __proto__ равен объекту CommandLineAPI

это как понимать ? __proto__ занята , как class и т.д ?

застопорился только на этом. остальное ок.

тираду оставлю на pastie. чтоб не пропадала зря:)

да ты же почти как Джон Резинг:) !

B@rmaley.e><e 12.12.2011 02:01

melky, круто, только функция возвращает -1.
alert(
(function pewpew(Infinity, length, __proto__) {
	return [,,~0.[0|0]][pewpew.__proto__.length && Infinity, -~String(this).length >> __proto__] << (0. === .0) + Infinity;
})

.apply(typeof pewpew, [,,2])
)


Ошибка в 151-ой строке.
Цитата:

Сообщение от melky
у меня __proto__ равен объекту CommandLineAPI

это как понимать ? __proto__ занята , как class и т.д ?

Который внутри функции? Быть не может. И у меня такого не происходит.

melky 12.12.2011 10:14

Цитата:

Сообщение от B@rmaley.e><e (Сообщение 142123)
Ошибка в 151-ой строке.Который внутри функции? Быть не может. И у меня такого не происходит.

сам удивлён. это произошло, когда я из консольного вызова этой функции (ну просто в консоль код подставил) и подписал в её начале debugger. наверное, тут собака зарыта :)

PS там вроде 148 строк :-?

PSS ошибка была в том, что я написал в разделе ARR, что он будет таким :
[,,-1]

а потом в коде и в других местах писал , что он будет равен
[,,2]

в этом и была ошибка. лол :) это от невнимательности. она меня везде преследует.

таки опубликую этот пост, с поправкой.

melky 12.12.2011 10:26

написал всё в пунктиках :

  • общий вид кода :
    (function ... (...) {...} ).apply(...)
    

    создает анонимную функцию с указанным именем и сразу запускает её на выполнение, меняя this внутри неё и передавая аргументы

  • общий вид return
    return ARR[key] << NUM
    

    т.е. создаст массив (ARR), из него выберет значение по ключу (key) и вернёт его значение, сдвинутое в двоичном представлении на NUM битов влево с добавлением нулей.

рассмотрим return поподробней, в нескольких частях
  • ARR
    return *!*[,,~0.[0|0] ]*/!* [ ... ] << ...;
    

    создаст массив с длиной 3, где первый (key==0) и второй (key==1) равны undefined, а последний равен -1. почему ? краткая схема должна показать ход тождественных преобразований
    ~0.[0|0] =>  ~0.[0] => ~undefined => -1
    

    убедитесь сами. причём разложение побитового "НЕ" (~) на тождественную ему математическую операцию ( ~a == -1*(a+1) ) не даст такого же результата, потому что любые арифметические операции (сложение, деление...) с undefined дают NaN :
    alert( ~undefined == -1*(undefined+1) ); // false
    

    итак. наш массив таков :
    [  undefined, undefined, -1 ]
    

    идём дальше.
  • key
    pewpew.__proto__.length && Infinity, -~String(*!*undefined||??*/!*).length >> __proto__
    

    (подчёркнуто то, что неоднозначно : если в текущей области видимости есть переменная pewpew, то будет что-то отличное от undefined)
    ... ну да ладно. посчитаем, что ничего не определялось до запуска функции.
    его формат :
    Код:

    NUM && undefined, NUM >> 2
    значения аргументов подставлены из apply. там ещё length равен undefined - по аналогии с верхним пунктом.

    ... преобразовывается формат в такой (следуем по запятой - она просто возвратит значение справа)
    Код:

    NUM && NUM >> 2
    т.е. в виде кода это :
    pewpew.__proto__.length && undefined, -~String(undefined).length >> 2
    

    обернём в скобки, чтобы пояснить, что операторы в JS работают слева направо :
    ( (NUM&&undefined), NUM) >> NUM
    

    а теперь разбираем:
    pewpew будет указывать на текущую функцию (arguments.callee). её свойство __proto__ равно пустой функции Empty.
    вот тут я почесал репу. я знаю, почему, но не могу объяснить. это вторая стадия понимания (первая - "не понял").. плохо. буду читать :)
    ну да ладно.

    т.е.
    pewpew.__proto__.toString() == "function Empty(){}"
    

    у этой функции мы получаем количество аргументов length. само собой, оно равно нулю - 0

    т.е. конструкция превращается в такую
    (pewpew.__proto__.length, -~String(undefined).length) >> 2
    

    >> будет работать с результатом запятой.

    результат запятой- то, что находится с правой её стороны.

    код превращается в такой :
    -~String(undefined).length >> 2
    

    этот код приведёт undefined к строке ("undefined", само собой)
    далее он получит её длину (9), далее (от ~) прибавит к ней 1, умножит на -1 и (от -) поставит противоположный знак.
    получаем
    10 >> 2
    

    это равно
    alert( 10 >> 2 ); // 2
    

    идём дальше.
  • <<NUM
    (0. === .0) + Infinity
    

    то, что в скобках - разная форма записи одного и того же числа. разумеется, результат выполнения равен true :
    Код:

    0. => 0  }
                  |  =>  0 === 0    =>    true
    .0 => 0  }

    далее идёт суммирования булевого true, который при приведении к числу становится 1 с undefined (аргумент)
    это равно NaN :
    Код:

    (true + undefined) === NaN
всё.

таким образом, форма записи этой функции расширяется до :
(убрал запятую и &&.)
(function pewpew(Infinity, length, __proto__){

    return [undefined, undefined, -1][ -~String(undefined).length >> 2  ] << NaN;

}).call(typeof pewpew, undefined, undefined, 2);

...проверим, равны ли возвращаемые значения этого кода и оригинального ?
var original = (function pewpew(Infinity, length, __proto__) {
  return [,,~0.[0|0]][pewpew.__proto__.length && Infinity, -~String(this).length >> __proto__] << (0. === .0) + Infinity;
}).apply(typeof pewpew, [,,2]);

var remixed = (function pewpew(Infinity, length, __proto__){
    return [undefined, undefined, -1][ -~String(undefined).length >> 2  ] << NaN;
}).call(typeof pewpew, undefined, undefined, 2);

alert( original === remixed );

да. всё хорошо :)


если подставить переменные, то получается (без return. это уже не функция. просто код) :

[undefined, undefined, -1][2] << NaN

это эквивалентно :
-1 << NaN

и равно это
alert( -1 << NaN ); //  -1



THE END

nerv_ 12.12.2011 10:55

melky, Приветствую! Тут, наверное, опечатка
Цитата:

Сообщение от melky
создаст массив с длиной 3, где первый (key==0) и второй (key==2) равны undefined

и тут тоже
Цитата:

Сообщение от melky
~0.[0|0] => ~0..0 => ~undefined => -1


melky 12.12.2011 20:51

Цитата:

~0.[0|0] => ~0..0 => ~undefined => -1
и нет, и да.

две точки поставлены для обращения к свойству 0 числа 0.

аналог :
Number.prototype.test = "okay";
alert( 0..test ); // okay


вообще, я с сонным мозгом забыл про квадратные скобки. спасибо за находки :)

поправил.

nerv_ 12.12.2011 21:46

melky, эт Вам спасибо, что на нас, неучей, время тратите ^_^
Я так понимаю, две точки - обращение к прототипу. А как к нему еще можно обратиться?

B@rmaley.e><e 12.12.2011 21:48

Цитата:

Сообщение от nerv_
Я так понимаю, две точки - обращение к прототипу. А как к нему еще можно обратиться?

Это обычное обращение к свойству, но с поправкой на то, что в числах точка используется ещё и для отделения целой части от дробной. Поэтому приходится писать 1..property, что эквивалентно (1).property.

Ну и это всё же не обращение к прототипу, а обращение к свойству. Но т.к. у примитивов своих свойств не бывает, значение может быть взято только из прототипа.

dmitriymar 12.12.2011 21:55

Блин,народ тело пишет всякую ерунду в своём извращенном сознании ,а вы в этом бреде ещё пытаетесь разобраться.
Не Гоните!!! помните?- с кем поведёщься от того и наберёшься??!!!:agree:
блин ща минусовать начну,зная что вы заминусете возможможно больше в ответ,но это возможно вернёт вас к реальности-поймёте что ведётесь на бред шизофреника!!

nerv_ 12.12.2011 22:22

Цитата:

Сообщение от dmitriymar
Не Гоните!!! помните?- с кем поведёщься от того и наберёшься??!!!

"С кем поведешься, так тебе и надо" :dance:
Цитата:

Сообщение от dmitriymar
Блин,народ тело пишет всякую ерунду в своём извращенном сознании ,а вы в этом бреде ещё пытаетесь разобраться.

Иной раз приходится разобираться в чужом бреде и от этого ни куда не денешься. А код (по возможности) надо уметь читать любой(обфускация, компрессия и т.п. извращения не в счет)

B@rmaley.e><e, благодарю. Как хорошо, что Вы не позволили мне придти к ложным выводам/умозаключениям :)
(пытаюсь плюсовать Вам карму, но чем форум ругается...)

melky 12.12.2011 22:28

Цитата:

Сообщение от dmitriymar (Сообщение 142308)
Блин,народ тело пишет всякую ерунду в своём извращенном сознании ,а вы в этом бреде ещё пытаетесь разобраться.
Не Гоните!!! помните?- с кем поведёщься от того и наберёшься??!!!:agree:
блин ща минусовать начну,зная что вы заминусете возможможно больше в ответ,но это возможно вернёт вас к реальности-поймёте что ведётесь на бред шизофреника!!

да, так оно и есть. Только одно "НО" : я то от этого уже ушёл. да , у меня была эта отвратительная привычка - до жопы сокращать код, просто потому, что так "меньше букв". и комментариев не писать, потому что это "лишние буквы".

мне тогда было невдомёк про чистый и понятный код :)
я глупо превращал свой стиль в стиль компилятора от гугла.

сейчас же я так (обфусцированно) не пишу и стараюсь от этого уберегать других

dmitriymar 12.12.2011 22:47

melky,
ты профи , а он ..ню гонит ради дешёвых пантов -разница есть. человек какой понимает что делает и чел какой от фоноря ..ню гонит -между ними ничего общего нет:yes: и никаких параллелей между ними нет

Livanderiaamarum 12.12.2011 22:50

Цитата:

Сообщение от melky (Сообщение 142318)
мне тогда было невдомёк про чистый и понятный код :)
я глупо превращал свой стиль в стиль компилятора от гугла.

ооой как знакомо)! я когда то даже сложение вычитанием заменял) потому что так БЫСТРЕЕ работает код)) было дело

trikadin 12.12.2011 22:53

Цитата:

Сообщение от Livanderiaamarum
я когда то даже сложение вычитанием заменял) потому что так БЫСТРЕЕ работает код))

Это искренний, детский БРЕД!

Вы знаете, как в компьютере происходит вычитание?

trikadin 12.12.2011 22:55

Цитата:

Сообщение от nerv_
"С кем поведешься, так тебе и надо"

Вспомнилось: с кем поведёшься, на того и дети похожи...

Livanderiaamarum 12.12.2011 22:56

Цитата:

Сообщение от trikadin (Сообщение 142343)
Это искренний, детский БРЕД!
Вы знаете, как в компьютере происходит вычитание?

вы можете сделать цикл на 10 000 000 действий засекая время вначале и в конце))) и проверить))
мы занимались оптимизацией кода для игры на айфоне на canvas и использовали это) то же самое относительно PC ) но вы видно нубок:dance:

melky 12.12.2011 23:06

Цитата:

Сообщение от dmitriymar (Сообщение 142332)
melky,
ты профи , а он ..ню гонит ради дешёвых пантов -разница есть. человек какой понимает что делает и чел какой от фоноря ..ню гонит -между ними ничего общего нет:yes: и никаких параллелей между ними нет

:DD какой ты злой сегодня, dmitriymar


PS до профи мне ещё огого :)

Цитата:

Сообщение от Livanderiaamarum (Сообщение 142336)
ооой как знакомо)! я когда то даже сложение вычитанием заменял) потому что так БЫСТРЕЕ работает код)) было дело

выводы сделаны из прочтения статей на хабре? это моя история.
Цитата:

Сообщение от Livanderiaamarum (Сообщение 142346)
мы занимались оптимизацией кода для игры на айфоне на canvas и использовали это) то же самое относительно PC ) но вы видно нубок:dance:

ааа. ну тогда всё ясно. муравьиная оптимизация оправдана для и для игр, и для iphone!

dmitriymar 12.12.2011 23:11

Цитата:

Сообщение от melky
PS до профи мне ещё огого :)

скромность-твой недостаток:)

trikadin 12.12.2011 23:13

Запустил три раза, каждый раз результат у первого оказывался больше.

Следующий код может на какое-то время повесить браузер.

t1= +(new Date());
j=40000000;
for (var i=0; i!= 40000000; ++i) {
 j-= 2;
};
alert(+(new Date()) - t1); // 408, 410, 411

t1= +(new Date());
j=-40000000;
for (var i=0; i!= 40000000; ++i) {
 j+= 2;
};
alert(+(new Date()) - t1); // 403, 409, 409

melky 12.12.2011 23:23

у меня в ФФ :
Цитата:

427, 428, 428, 427

427, 428, 427, 427
да тут же периодичность )

devote 12.12.2011 23:25

Опера 11.60
Цитата:

4194 3874 3910
4043 3866 3929

trikadin 12.12.2011 23:26

Livanderiaamarum, а теперь к теме.

Вычитание в компьютере сводится к сложению. Идите в школу, материал за десятый класс максимум.

Livanderiaamarum 12.12.2011 23:43

Цитата:

Сообщение от trikadin (Сообщение 142363)
Livanderiaamarum, а теперь к теме.

Вычитание в компьютере сводится к сложению. Идите в школу, материал за десятый класс максимум.

ахахах, как раз в x86 СЛОЖЕНИЕ сводится к вычитанию!!!!!! Транзисторы не умеют склыадываться физически)!! ну ты и лол!!ты про какой уровень говоришь вообще?

trikadin 12.12.2011 23:50

Цитата:

Сообщение от Livanderiaamarum
ахахах, как раз в x86 СЛОЖЕНИЕ сводится к вычитанию!!!!!

Ссылки)

Цитата:

Сообщение от Livanderiaamarum
Транзисторы не умеют склыадываться физически)

Согласен, складываться транзисторы пока вроде не умеют.

Цитата:

Сообщение от Livanderiaamarum
ты про какой уровень говоришь вообще?

Я говорю про сложение и вычитание. Не про уровень.

devote 12.12.2011 23:53

Цитата:

Сообщение от Livanderiaamarum
ахахах, как раз в x86 СЛОЖЕНИЕ сводится к вычитанию!!!!!! Транзисторы не умеют склыадываться физически)!! ну ты и лол!!ты про какой уровень говоришь вообще?

Лучше не позорься, твое познание в электроники сводиться к нулю... На твоем месте я бы лучше вообще помолчал по поводу того о чем не осведомлен.

Livanderiaamarum 12.12.2011 23:53

Цитата:

Сообщение от trikadin (Сообщение 142370)
Ссылки)


Согласен, складываться транзисторы пока вроде не умеют.


Я говорю про сложение и вычитание. Не про уровень.

ну есть физический уровень микросхем и есть абстрактный. то что ВСЕ действия сводятся к сложению это очевидно и ребенку. что комп больше ни че делат не умеет. я говорю про транзисторную реализацию. например про операции над int числами ump блока у intel // физически операнды "вычитаются". абстрактно это понимается как сложение ЛИШЬ из-за знака.

trikadin 13.12.2011 00:06

Цитата:

Сообщение от dmitriymar
ты не слышишь ничего кроме своего бреда.

Разговор закончен, я полагаю.

devote 13.12.2011 00:09

Цитата:

Сообщение от trikadin
Разговор закончен, я полагаю.

И нечего было вообще его заводить, человек не осведомлен ни о чем. Послушав его научишься не тому.

nerv_ 13.12.2011 09:25

Цитата:

Сообщение от trikadin
Вычитание в компьютере сводится к сложению.

Насколько мне известно, так оно и есть :)

Цитата:

Сообщение от trikadin
Запустил три раза, каждый раз результат у первого оказывался больше.

189, 194
214, 230
177, 194
213, 227

trikadin 13.12.2011 15:57

nerv_, прикольно) А ось/браузер узнать можно?

nerv_ 13.12.2011 16:40

trikadin, Windows XP x86, FF 5.0


Часовой пояс GMT +3, время: 01:39.