JS je snad este horsie ako PHP rubrika: Programování: JavaScript

6 coolmip
položil/-a 2.1.2017
((!+[]+!![]+!![]+!![]+!![]+[])+(+[]))
JS je este horsi ako PHP ked z tohoto vypocita 50!! resp. string "50"
! = false (teda 0)
!! = true (teda 1)
[] je pole, takze to je asi 0
takze po prepisani to je:
((0+0+1+0+1+0+1+0+1+0+0)+(+0))
co je ((5) + ("0"))
a teda vysledok je 50 ....
<code>
nejake rozumne "prelozenie" toho kusku kodu do ineho "normalneho" jazyka - ale programovo?
odkaz
7 maryo
odpověděl/-a 2.1.2017
 
upravil/-a 2.1.2017

"Horší" je dost subjektivní. Skoro každej jazyk má svoje. Jasně, ten kód je nečitelnej a hnusnej, ale co je za problém, na takovej kód v reálu nenarazíte a kdyby jo, tak utečte :D. Postupně si ten vyraz projeďte v nějaký konzoli.

"! = false (teda 0)"
! neni false, je to negace toho výrazu za tím, jde o unární operátor, má přednost před binárním a při přičítání se true chová jako 1 a false jako 0

"[] je pole, takze to je asi 0"
Pole samo o sobě je pole. +[] je 0, protože jde o unární plus, takže dojde k přetypování na číslo viz Unary Plus na MDN

Něco jinýho je binární plus. Přičítat pole k číslu "nejde", takže JS provede coercion (přetypuje to na "něco" kompatibilního s tím druhým expression). Pole je typ Array a má metodu toString, takže dojde k přetypování na řetězec zavoláním tý metody toString. A když se "sčítá" číslo a řetězec, vyleze z toho řetězec.

Jinýmy slovy.

(!+[] + !![] + !![] + !![] + !![] + []) + (+[])
(!Number([]) + Boolean([]) + Boolean([]) + Boolean([]) + Boolean([]) + (new Array).toString()) + Number([])
!0 + 1 + 1 + 1 + 1 + "" + 0
1 + 1 + 1 + 1 + 1 + "" + 0
5 + "" + 0
"5" + 0
"50"

Všechno je pořád JS

Komentáře

  • Honza Břešťan : Na ten kod se da v realu dobre narazit u XSS, projde to strasnou spoustou pokusu o escaping. Doporucuju https://alf.nu/alert1 3.1.2017

Pro zobrazení všech 11 odpovědí se prosím přihlaste:

Rychlé přihlášení přes sociální sítě:

Nebo se přihlaste jménem a heslem:

Zadejte prosím svou e-mailovou adresu.
Zadejte své heslo.