Ho, mi faris ĝin denove: Sencimigi oftajn erarojn en JavaScript

Ho, mi faris ĝin denove: Sencimigi oftajn erarojn en JavaScript

Skribi JavaScript-kodon povas esti malfacila kaj foje tute timiga, kiel multaj programistoj konas. En la procezo de laboro, eraroj neeviteble ekestas, kaj kelkaj el ili estas ripetitaj ofte. Ĉi tiu artikolo, celita al komencaj programistoj, parolas pri ĉi tiuj eraroj kaj kiel solvi ilin. Por klareco, la nomoj de funkcioj, propraĵoj kaj objektoj estas prenitaj de populara kanto. Ĉio ĉi helpas vin rapide memori kiel korekti oftajn erarojn.

Ni memorigas vin: por ĉiuj legantoj de "Habr" - rabato de 10 000 rubloj kiam oni enskribas en iu ajn Skillbox-kurso per la reklamkodo "Habr".

Skillbox rekomendas: Praktika kurso "Poŝtelefona Programisto PRO".

TypeError: posedaĵo ne estas difinita

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)

La ekzempla kodo supre ĵetas la eraron Nekaptita TypeError: Ne povas legi posedaĵon 'bonŝanca' de nedifinita. La problemo estas, ke la knabina objekto ne havas nomitan posedaĵon, kvankam ĝi havas nom-posedaĵon. Kaj ĉar la posedaĵo girl.named ne estas difinita, vi ne povas aliri ĝin, ĉar formale ĝi ne ekzistas. Sed se vi anstataŭigas girl.named.lucky per girl.name, tiam ĉio funkcios kaj la programo revenos Lucky.

Vi povas lerni pli pri la propraĵoj legi ĉi tie.

Kiel solvi Tipo-Erarojn

Tiperaroj okazas kiam programisto provas fari agojn sur datumoj kiuj ne kongruas kun specifa tipo. Ekzemploj inkluzivas uzi .bold(), peti nedifinitan posedaĵon, aŭ voki funkcion, kiu fakte ne estas funkcio.

Do, se vi provas voki girl(), vi ricevos la eraron Uncaught TypeError: viaVariable.bold ne estas funkcio kaj girl ne estas funkcio, ĉar ĝi estas fakte objekto vokita, ne funkcio.

Por forigi erarojn, vi devas studi la variablojn. Do, kio estas knabino? Kio estas knabino.nomita? Vi povas ekscii analizante la kodon, montrante variablojn uzante console.log, la erarĉimilan komandon aŭ vokante la variablonomon en la konzolo. Vi devas certigi, ke eblas funkcii sur la datumtipo enhavita en la variablo. Se ĝi ne taŭgas, ŝanĝu ĝin, ekzemple, aldonu kondiĉon aŭ provu..catch bloko - kaj akiru kontrolon pri la plenumo de la operacio.

Stako Superfluo

Se vi kredas la aŭtorojn de la kantoteksto de la kanto Baby One More Time (ĉi tio estas Britney Spears, jes), tiam la vorto hit en ĉi tiu kunteksto signifas la deziron de la kantisto esti vokita denove (jen klarigo de la kunteksto mem de la kanto - noto de la tradukinto). Povas esti, ke ĉi tiu deziro kondukos al pliigo de la nombro da vokoj en la reala vivo. Sed en programado, ĉi tio estas rekurso, kiu povas kaŭzi eraron, se la voka stako superfluas.

La eraroj aspektas jene:

Eraro: Sen stakspaco (Rando)
Interna Eraro: tro da rekurso (Firefox)
RangeError: Maksimuma voka stakgrandeco superita (Khrome)

Stako superfluo okazas se la programisto ne konsideras la bazkazon en la rikurso, aŭ se la kodo ne traktas la celitan kazon.

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

En ĉi tiu kazo, stillBelieve neniam povas esti falsa, do oneMoreTime estos nomita ĉiufoje, sed la funkcio neniam finiĝos.

Se vi komencas fidi je du amikoj, ĉi tio reduktos solecon, kaj vi ne devos atendi vokon.

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

Ekzemplo estas kazoj kun senfinaj bukloj, kiam la sistemo ne generas erarmesaĝon, sed la paĝo sur kiu la JavaScript-kodo estas ekzekutita simple frostiĝas. Ĉi tio okazas se la buklo dum ne havas finkondiĉon.

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

Vi povas solvi la problemon jene:

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

Sencimigi senfinajn maŝojn kaj rekursiojn

Se vi havas problemon pri senfina buklo, vi devas fermi la langeton en Chrome aŭ Edge, kaj fermi la retumilon en Firefox. Post ĉi tio, vi devas zorge analizi la kodon. Se vi ne povas trovi la problemon, indas aldoni sendanĝeran komandon al via buklo aŭ funkcio kaj kontroli la valorojn de la variabloj. Se la rezulto ne respondas al tio, kion oni atendis, tiam ni anstataŭigas ĝin, tio povas esti farita facile.

En la supra ekzemplo, erarserĉilo devus esti aldonita kiel la unua linio de la funkcio aŭ buklo. Tiam vi devas malfermi la sencimigan langeton en Chrome, analizante la variablojn en amplekso. Uzante la sekvan butonon vi povas spuri iliajn ŝanĝojn kun ĉiu ripeto. Ĉio ĉi estas facile fari, kaj plejofte la problemo estas trovita.

Vi povas legi pli pri ĉio ĉi ĉi tie (por kromo) kaj ĉi tie (por Firefox).

Sintaksa eraro

Unu el la plej oftaj eraroj en JavaScript estas SyntaxError. Tekstaj redaktilaj etendoj helpos vin eviti ilin. Ekzemple, Bracket Pair Colorizer markas krampojn en la kodo per malsamaj koloroj, kaj Prettier aŭ simila analiza ilo ebligas rapide trovi erarojn. La plej bona elekto por redukti la verŝajnecon de SyntaxError estas minimuma nestado.

Kunhavigu en la komentoj: kion vi faras por malhelpi erarojn aŭ rapide detekti kaj forigi ilin?

Skillbox rekomendas:

fonto: www.habr.com

Aldoni komenton