eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programmingpopaprany JS › Re: popaprany JS
  • Path: news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed2.atman.pl!newsfeed.atman.pl!.P
    OSTED!not-for-mail
    From: bartekltg <b...@g...com>
    Newsgroups: pl.comp.programming
    Subject: Re: popaprany JS
    Date: Mon, 27 Mar 2017 20:42:41 +0200
    Organization: ATMAN - ATM S.A.
    Lines: 108
    Message-ID: <obbmf2$5ps$1@node1.news.atman.pl>
    References: <j6xj1vxv7su9$.dlg@tyczka.com>
    NNTP-Posting-Host: 89-70-119-159.dynamic.chello.pl
    Mime-Version: 1.0
    Content-Type: text/plain; charset=utf-8; format=flowed
    Content-Transfer-Encoding: 8bit
    X-Trace: node1.news.atman.pl 1490640162 5948 89.70.119.159 (27 Mar 2017 18:42:42 GMT)
    X-Complaints-To: u...@a...pl
    NNTP-Posting-Date: Mon, 27 Mar 2017 18:42:42 +0000 (UTC)
    User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101
    Thunderbird/45.8.0
    In-Reply-To: <j6xj1vxv7su9$.dlg@tyczka.com>
    Xref: news-archive.icm.edu.pl pl.comp.programming:210352
    [ ukryj nagłówki ]

    On 27.03.2017 19:02, Roman Tyczka wrote:
    >
    > Próbuję przekonwertować kawałek kodu z JS na delphi, ale poziom zakręcenia
    > mnie przerósł, proszę o pomoc w wyjaśnieniu ludzkim językiem co tu się
    > dzieje:
    >
    >
    > function(e, s, i)
    > {
    > var n, a, o = "",
    > l = t.isArray(e),
    > r = 0;
    > for (n = 0, a = s.length; n < a; n += 1) "+" === s.charAt(n) ? o +=
    > i.charAt(n) : "*" === s.charAt(n) && (o += l ? e[r++].value :
    > e.charAt(r++));
    > return o
    > }
    >
    > Jako, że JS ma typowanie między pośladkami to typy wejściowe odgaduje z
    > szerszego kontekstu, którego tu nie umieszczam by nie mącić, jako:
    >
    > e - chyba tablica, w każdym razie wynik funkcji z jQuery
    > this.ui.maskedInput.serializeArray()
    >
    > s - to string z maską złożoną ze znaków + i *
    > // "mask": "+++*+*+***++++++++++++++++++++++"
    >
    > i - to sól w łanćuchu tekstowym
    > // "salt": "rDUrqpBMmlNGJQgk87uKCUGMlK4dU51R",
    >
    >
    > Całość to kawałek formularza logowania, a konkretnie wyliczania hasha z
    > hasła.
    >
    > Proszę szczególnie o rozwikłanie tej pętli, czyli konkretnie tego:
    >
    > "+" === s.charAt(n) ? o += i.charAt(n) : "*" === s.charAt(n) && (o += l ?
    > e[r++].value : e.charAt(r++));
    >
    > To koszmarek jakiś :-)

    Jeśli to dobrze rozumiem, to genialny przykład "chackerstwa" (tak, ch;))



    "+" === s.charAt(n) ? o += i.charAt(n)

    Na razie prosto. Operator trójargumentowy ?: jak w c++.

    Czy n-ta (kto normalny iteruje po n, czyję się zgorszony!:)
    literaka s to "+"
    (porównujemy ===, bo == jest miękkie :)
    https://dorey.github.io/JavaScript-Equality-Table/ )

    Jeśli tak, to dodajemy literkę na koniec o,
    o += i.charAt(n)
    (nie wynika nic z tego, co jest po :)
    jeśli nie, to (co innego, o tym poźniej).

    Zawsze używałem ?: w formie
    x = b?a:b;
    a tu jety użyte po prostu jako if(b) a() : b();
    Poza zmyleniem przeciwnika chyba nie ma nic w tym złego:)

    Teraz zaczynają się schody, jeśli s[n] nie ejst plusem,
    wykona się to:

    "*" === s.charAt(n) && (o += l ? e[r++].value : e.charAt(r++))

    Nieco rozszerzając:

    "*" === s.charAt(n)
    &&
    (o += l ? e[r++].value : e.charAt(r++))

    Sztuczka polega na tym, że to wyrażenie wylicza
    się do boola. Jeśli s[n] to '*', zadziała
    leniwa ewaluacja i nawias się nie wykona.
    Jeśli jest czym innym niż *, mamy (strzelam dodatkowe
    nawiasowanie):

    o += ( l ? e[r++].value : e.charAt(r++))

    l oznaczało "e jest tablicą" (od typu 't'?).
    tutaj wołaczamy wiec do o to, co ejst pod 'e'
    na r-tym miejscu, tylko w zalezności od tego
    jakiego typu jest e, różnie się to tej literki
    dobieramy. Ot, takie bieda templejty ;-)

    Nawet w JS nalezałoby tu raczej zrobić tego ifa
    na poczatku lub jakoś inaczej opokować to wyciąganie.


    Ostatecznie strzelałbym, że to znaczy(to nie JS:)

    if ("+"== s.charAt(n))
    o += i.charAt(n);
    else if ('*' ~= a.charAt(n) )
    o+ = (l ? e[r++].value : e.charAt(r++) );


    A, drobna uwaga, nie znam JS ;-)


    pzdr
    bartekltg


Podziel się

Poleć ten post znajomemu poleć

Wydrukuj ten post drukuj


Następne wpisy z tego wątku

Najnowsze wątki z tej grupy


Najnowsze wątki

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: