Java programozas, javascript
  • Malakai
    #372
    Még egy tanulmányi feladat? :)
    Ha igen, akkor egy tipik olyan, aminek tényleges gyakorlati haszna nincs.

    Hint:
    var obj = {}
    console.log({} - []) // => -0
    console.log(obj - []) // => NaN
    console.log({} + []) // => 0
    console.log(obj + []) // "[object Object]"


    Magyarázat:
    SPOILER! Kattints ide a szöveg elolvasásához!
    Azért nincs gyakorlati haszna, mert ez a javascript parser elég kivételes esete miatt és a gyakorlatban ritkán használt type konverzió miatt működik így.

    Parser: Amikor a javascript parser a kódban látja a sor elején a {} zárójeleket (expression elején pontosabban, ezért ugyanez console.log()-ban is működik), akkor egy üres blokkot lát (mint pl kondíció, funkció blokkja), nem pedig egy üres object literalt. Mivel üres blokk, így csak átugorja és megy tovább, onnantól a maradék már egy unary operator (-) és egy üres array ([]). Az-az ugyanaz, mintha csak ez lenne: -[] És ezért nem működik, ha már változóba teszed a zárójeleket az elején, mert akkor már ténylegesen egy üres object-el próbálod elvégezni.

    Ritka type konverzió: Üres array-en type konverzió egy a sok type konverzióból javascript-ben, aminek nem sok értelme, de ez legalább egy olyan amivel ritkán találkoznál gyakorlatban. Amikor a unary operator-al egy pozitív, vagy negatív számként akarod kezelni, akkor átváltja előbb boolean-re és azt számra és mivel az üres array falsy ezért 0. Ezért kapsz az unary operator-al -0-át a "kivonásnál".

    Nagyon sok fura, logikátlan típus konverzióban javascript-ben, csak egy példának, ha unary operator helyett binary operator-ként próbálod egy tényleges számmal összeadni az üres array-t, akkor már NaN-t kapsz, vagy pl ha nem üres array-t próbálsz unary operator-al számmá konvertálni, akkor megint csak NaN-t kapsz 1 helyett.


    Gyakorlati tanulság max annyi, ha egy argumment-ben / paraméterként többféle típust elfogadsz, akkor mindig ellenőrizd, hogy milyen típussal dolgozol. :)
    Utoljára szerkesztette: Malakai, 2018.08.03. 14:10:38