Ups, ma tegin seda jÀlle: JavaScripti levinud vigade tÔrge

Ups, ma tegin seda jÀlle: JavaScripti levinud vigade tÔrge

MÔnikord on JavaScripti koodi kirjutamine keeruline ja vahel isegi hirmutav, mis on tuttav paljudele arendajatele. Töö kÀigus tekivad kindlasti vead, millest osa kordub sageli. Artiklis, mis on mÔeldud algajatele arendajatele, rÀÀgitakse nendest vigadest ja nende lahendamise viisidest. NÀiteks toimi funktsioonide, omaduste ja objektide nimedest populaarse laulu. KÔik see aitab kiiresti meelde jÀtta, kuidas tavalisi vigu parandada.

Tuletame meelde: kĂ”igile «Habr» lugejatele – 10 000 rubla allahindlus igale Skillboxi kursusele, kasutades sooduskoodi «Habr».

Skillbox soovitab: Praktiline kursus «Mobiilne arendaja PRO».

TypeError: omadus ei ole mÀÀratud

let girl = {
    name: "Lucky",
    location: "Hollywood",
    profession: "star",
    thingsMissingInHerLife: true,
    lovely: true,
    cry: function() {
        return "cry, cry, cries in her lonely heart"
    }
}
console.log(girl.named.lucky)

Ülaltoodud koodi nĂ€ide annab veateate Uncaught TypeError: Cannot read property ‘lucky’ of undefined. Probleem on selles, et objektil girl ei ole omadust named, kuigi on omadus name. Kuna omadus girl.named ei ole mÀÀratud, ei saa sellele ka ligi pÀÀseda, kuna formaalselt seda ei eksisteeri. Kuid kui asendada girl.named.lucky girl.name'iga, siis kĂ”ik töötab ja programm naaseb Lucky.

Rohkem teavet omaduste kohta on vÔimalik lugeda siit.

TypeErrori tÔrgete kÔrvaldamise meetodid

TypeErrori vead tekivad, kui programmeerija proovib teha toiminguid andmetega, mis ei vasta mÀÀratud tĂŒĂŒbile. NĂ€iteks vĂ”ib tuua .bold() rakendamise, undefined omaduse pĂ€rimise vĂ”i funktsiooni sikutamise, mis tegelikult ei ole funktsioon.

Seega, kui proovida kutsuda girl(), siis ilmneb viga Uncaught TypeError: yourVariable.bold is not a function ja girl is not a function, kuna tegelikult kutsutakse objekti, mitte funktsiooni.

Vigade kĂ”rvaldamiseks on oluline uurida muutujaid. Mis on girl? Ent mis on girl.named? Seda saab vĂ€lja selgitada, kui analĂŒĂŒsida koodi, vĂ€ljastada muutujaid console.log abil, kasutada kĂ€su debugger vĂ”i kutsuda muutuja nimi konsooli. Tuleb veenduda, et on vĂ”imalik manipuleerida selle muutuja andmetĂŒĂŒbiga. Kui see ei sobi, siis muuda seda, nĂ€iteks lisa tingimus vĂ”i blokka try..catch — ja saad kontrolli tegutsemise ĂŒle.

Stack overflow

Kui usuda Baby One More Time laulu autorite jĂ€rgi (jah, see on Britney Spears), tĂ€hendab sĂ”na hit antud kontekstis lauljanna soovi, et talle helistataks veel kord (see on laulu konteksti selgitus, - tĂ”lkija mĂ€rkus). On tĂ€iesti vĂ”imalik, et see soov toob kaasa tĂ”usu telefonikĂ”nedes reaalses elus. Kuid programmeerimises on see rekursioon, mis suudab tekitada virnade ĂŒletĂ€itumise viga.

Vead nÀevad vÀlja jÀrgmiselt:

Error: Out of stack space (Edge)
InternalError: too much recursion (Firefox)
RangeError: Maximum call stack size exceeded (Chrome)

Virna ĂŒletĂ€itumine toimub, kui arendaja ei ole arvesse vĂ”tnud rekursiooni baasjuhtumit vĂ”i kui kood ei pöördu ette nĂ€htud juhtumi poole.

function oneMoreTime(stillBelieve=true, loneliness=0) {
    if (!stillBelieve && loneliness < 0) return
    loneliness++
    return oneMoreTime(stillBelieve, loneliness)
}

Antud juhul ei saa stillBelieve kunagi false-ks, seega toimub iga kord oneMoreTime kutsumine, kuid funktsiooni tÀitmine ei lÔpeta kunagi.

Kui aga hakata lootma kahe sĂ”bra peale, vĂ€hendab see loneliness (ĂŒksildus) ja kĂ”net ei pea ootama.

function oneMoreTime(stillBelieve=true, loneliness=0) {
    if (!stillBelieve && loneliness < 0) return
    loneliness--
    stillBelieve = false
    return oneMoreTime(stillBelieve, loneliness)
}

NĂ€iteks vĂ”ib tuua juhtumeid lĂ”pututest tsĂŒklitest, kus sĂŒsteem ei vĂ€ljastata veateadet, vaid leht, kus JavaScripti kood tĂ€idetakse, lihtsalt hangub. Nii juhtub, kui while tsĂŒklil pole lĂ”petamise tingimust.

let worldEnded = false
 
while (worldEnded !== true) {
  console.log("Keep on dancin' till the world ends")
}

Probleemi saab lahendada jÀrgmiselt:

let worldEnded = false
 
while (worldEnded !== true) {
  console.log("Keep on dancin' till the world ends")
  worldEnded = true
}

LĂ”putute tsĂŒklite ja rekursioonide tĂ”rkeotsing

Kui tekib probleem lĂ”putu tsĂŒkliga, tuleb Chrome'is vĂ”i Edge'is vahekaart sulgeda ning Firefoxis brauseri aken. PĂ€rast seda tuleb kood hoolikalt analĂŒĂŒsida. Kui probleemi ei Ă”nnestu leida, tasub tsĂŒklisse vĂ”i funktsiooni lisada kĂ€sk debugger ja kontrollida muutujaid. Kui tulemus ei vasta ootustele, siis asendame, seda saab kergesti teha.

Ülaltoodud nĂ€ites tuleks debugging'it lisada funktsiooni vĂ”i tsĂŒkli esimesele reale. SeejĂ€rel tuleb avada Chrome'i debugimise vahekaart ja analĂŒĂŒsida muutujaid scope'is. Kasutades nuppu next, saab jĂ€lgida nende muutumist igas iteratsioonis. KĂ”ike seda on lihtne teha ja enamikul juhtudel on probleem juba olemas.

KÔike seda saab pÔhjalikumalt lugeda siit (Chrome'i jaoks) ja siit (Firefoxile).

SĂŒntaksiviga

Üks levinumaid vigu JavaScriptis on SyntaxError. Nende vĂ€ltimiseks aitavad tekstiredaktori laiendused. NĂ€iteks Bracket Pair Colorizer mĂ€rgib koodis sulud erinevate vĂ€rvidega, samas kui Prettier vĂ”i sarnane analĂŒĂŒsitööriist vĂ”imaldab kiiresti vigu leida. Parim vĂ”imalus SyntaxError'i tekkimise tĂ”enĂ€osuse vĂ€hendamiseks on miinimum sisemisus.

Jagage kommentaarides: mida teie teete, et vigu vÀltida vÔi neid kiiresti tuvastada ja kÔrvaldada?

Skillbox soovitab:

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster