eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programmingpopaprany JS › Re: popaprany JS
  • Data: 2017-03-27 20:42:41
    Temat: Re: popaprany JS
    Od: bartekltg <b...@g...com> szukaj wiadomości tego autora
    [ pokaż wszystkie 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: