Môže sa (a== 1 && a ==2 && a==3) niekedy vyhodnotiť ako true?
Poznámka moderátora: Odolajte, prosím, nutkaniu upraviť kód alebo odstrániť toto upozornenie. Vzor bielych znakov môže byť súčasťou otázky, a preto by sa do neho nemalo zbytočne zasahovať. Ak patríte do tábora "biele znaky sú nepodstatné", mali by ste byť schopní akceptovať kód tak, ako je.
Je vôbec možné, aby sa (a== 1 && a ==2 && a==3)
mohlo vyhodnotiť ako pravdivé
v jazyku JavaScript?
Túto otázku na pohovore položila jedna z veľkých technologických spoločností. Stalo sa to pred dvoma týždňami, ale stále sa snažím nájsť odpoveď. Viem, že v každodennej práci takýto kód nikdy nepíšeme, ale som zvedavý.
2440
3
Ak využijete výhody ako funguje
==
, môžete jednoducho vytvoriť objekt s vlastnou funkcioutoString
(alebovalueOf
), ktorá pri každom použití zmení to, čo vráti, tak, aby spĺňala všetky tri podmienky.Dôvodom, prečo to funguje, je použitie voľného operátora rovnosti. Pri použití voľnej rovnosti, ak je jeden z operandov iného typu ako druhý, motor sa pokúsi previesť jeden na druhý. V prípade objektu na ľavej strane a čísla na pravej strane sa pokúsi previesť objekt na číslo tak, že najprv zavolá operátor
valueOf
, ak je volateľný, a ak nie, zavolá operátortoString
. V tomto prípade som použiltoString
jednoducho preto, že ma to napadlo,valueOf
by dávalo väčší zmysel. Ak by som namiesto toho vrátil reťazec ztoString
, motor by sa potom pokúsil previesť reťazec na číslo, čím by sme získali rovnaký konečný výsledok, hoci s trochu dlhšou cestou.JE TO MOŽNÉ!
Toto používa getter vnútri príkazu
with
, aby saa
vyhodnotilo na tri rôzne hodnoty.... to však ešte neznamená, že by sa to malo používať v skutočnom kóde...
Ešte horšie je, že tento trik bude fungovať aj pri použití
===
.V globálnom rozsahu sa to dá dosiahnuť pomocou nasledujúcich príkazov. Pre
nodejs
použite v nasledujúcom kóde namiestowindow
global
.Táto odpoveď zneužíva implicitné premenné poskytované globálnym rozsahom v kontexte vykonávania definovaním gettera na získanie premennej.