Java programozas, javascript
-
#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