7 vinkkiä käsittelemään määrittelemätöntä JavaScriptiä
Suurimmalla osalla moderneista kielistä, kuten Ruby, Python tai Java, on yksi nolla-arvo (nil
tai null
), mikä vaikuttaa järkevältä.
Mutta JavaScript on erilainen.
null
, mutta myös undefined
, edustavat tyhjiä JavaScript-arvoja. Joten mikä on tarkka ero niiden välillä?
Lyhyt vastaus on, että JavaScript-tulkki palauttaa undefined
, kun hän käyttää muuttujaa tai objektin ominaisuutta, jota ei ole vielä alustettu. Esimerkki:
Toisella puolella null
edustaa puuttuvaa objektia viite. JavaScript ei alusta muuttujia tai objektin ominaisuuksia null
-toiminnolla.
Jotkut alkuperäiset menetelmät, kuten String.prototype.match()
, voivat palauttaa null
merkitsemään puuttuvaa objektia. Katsokaa esimerkkiä:
Koska JavaScript on sallittu, kehittäjillä on houkutus käyttää alustamattomia arvoja. Olen myös syyllinen niin huonoon käytäntöön.
Tällaiset riskialttiit toiminnot aiheuttavat usein undefined
liittyviä virheitä:
-
TypeError: "undefined" is not a function
-
TypeError: Cannot read property "<prop-name>" of undefined
- ja samankaltaiset virheet.
JavaScript-kehittäjä voi ymmärtää tämän vitsin ironian :
Tällaisten virheiden vähentämiseksi sinun on ymmärrettävä tapaukset, joissa undefined
luodaan. Tutkitaan undefined
ja sen vaikutusta kooditurvallisuuteen.
1. Mikä on määrittelemätöntä
JavaScriptillä on 6 primitiivistä tyyppiä:
Ja erotettu objektityyppi: {name: "Dmitri"}
, .
6 primitiivisestä tyypistä undefined
on erityisarvo, jolla on oma tyyppinsä Määrittelemätön. ECMAScript-määrityksen mukaan:
Määrittelemätöntä arvoprimitiivistä arvoa käytetään, kun muuttujalle ei ole määritetty arvoa.
Standardi määrittelee selvästi, että saat undefined
, kun käytät alustamattomia muuttujia, ei-olemassa olevia objektin ominaisuuksia, ei-olemassa olevia taulukkoelementtejä ja vastaavia.
Muutama esimerkki:
Edellä oleva esimerkki osoittaa, että:
- alustamaton muuttuja
number
- olematon objektiominaisuus
movie.year
- tai ei-olemassa oleva taulukkoelementti
movies
arvioidaan undefined
.
ECMAScript-määrittely määrittelee undefined
-arvotyypin:
Määrittelemätön tyyppi on tyyppi, jonka ainoa arvo on
undefined
-arvo.
Tässä mielessä typeof
-operaattori palauttaa merkkijonon "undefined"
undefined
-arvolle:
Tietysti typeof
toimii hienosti varmistaakseen, että muuttuja sisältää undefined
-arvoa:
2. Skenaariot, jotka luovat määrittelemättömiä
2.1 Aloittamaton muuttuja
Ilmoitettu muuttuja, jota ei ole vielä määritetty arvoon (alustamaton), on oletusarvoisesti
undefined
.
Tavallinen ja yksinkertainen:
myVariable
on ilmoitettu eikä sitä ole vielä määritetty arvoon. Muuttujan käyttö arvioi arvon undefined
.
Tehokas tapa ratkaista alustamattomien muuttujien ongelmat on aina, kun mahdollista, antaa alkuarvo. Mitä vähemmän muuttujaa on alustamattomassa tilassa, sitä parempi.
Ihannetapauksessa määrität arvon heti ilmoituksen const myVariable = "Initial value"
jälkeen. Mutta se ei ole aina mahdollista.
Vinkki 1: Suosikki const
, muuten käytä let
, mutta jätä hyvästit var
Mielestäni yksi ECMAScript 2015: n parhaista ominaisuuksista on uusi tapa ilmoittaa muuttujat käyttämällä const
ja let
. Se on iso askel eteenpäin.
const
ja let
estetään lohkossa (toisin kuin vanhemmat toiminnot, jotka on määritelty var
) ja ovat ajallisessa kuolleessa vyöhykkeessä ilmoituksen riviin saakka.
Suosittelen muuttujaa const
, kun sen arvo ei muutu. Se luo muuttumattoman sidoksen.
Yksi const
-palvelun hienoista ominaisuuksista on, että sinun on määritettävä alkuarvo muuttujalle const myVariable = "initial"
. Muuttuja ei ole alttiina alustamattomalle tilalle, ja undefined
-sovelluksen käyttö on mahdotonta.
Tarkistetaan toiminto, jolla varmistetaan, onko sana palindromi:
length
ja half
-muuttujille määritetään arvo kerran. Vaikuttaa järkevältä julistaa ne const
, koska nämä muuttujat eivät muutu.
Käytä let
-ilmoitusta muuttujille, joiden arvo voi muuttua. Määritä alkuarvo heti kun mahdollista, esim. let index = 0
.
Entä vanha koulu var
? Ehdotan, että lopetan sen käytön.
var
ilmoitusongelma on muuttujan nostaminen funktion laajuudessa. Voit ilmoittaa var
-muuttujan jossain toiminnon laajuuden lopussa, mutta silti pääset siihen ennen ilmoitusta: ja saat undefined
.
myVariable
on käytettävissä ja sisältää undefined
jo ennen ilmoitusriviä: var myVariable = "Initial value"
.
Päinvastoin muuttujaa const
tai let
ei voida käyttää ennen ilmoitusriviä – muuttuja on ajallisesti kuolleella alueella ennen ilmoitusta. Ja se on mukavaa, koska sinulla on vähemmän mahdollisuuksia käyttää undefined
.
Yllä oleva esimerkki päivitettiin nimellä let
(sen sijaan var
) heittää ReferenceError
, koska ajallisen kuolleen vyöhykkeen muuttuja ei ole käytettävissä.
muuttuja.
Vinkki 2: Lisää koheesiota
Koheesio kuvaa sitä, missä määrin moduulin elementit (nimitila, luokka, menetelmä, koodilohko) kuuluvat yhteen. Koheesio voi olla korkea tai matala.
Korkean koheesion moduuli on suositeltava, koska tällaisen moduulin elementit keskittyvät vain yhteen tehtävään. Se tekee moduulista:
- Kohdennettu ja ymmärrettävä: helpompi ymmärtää, mitä moduuli tekee
- Ylläpidettävä ja helpompi muokata: moduulin muutos vaikuttaa vähemmän moduuleihin
- Uudelleenkäytettävä: keskittyminen yhteen tehtävään helpottaa moduulin uudelleenkäyttöä.
- Testattavissa: helpommin testaat moduulin, joka on keskittynyt yhteen tehtävään. p>
Suuri koheesio, johon liittyy löysä kytkentä, on hyvin suunnitellun järjestelmän ominaisuus.
Koodilohkoa voidaan pitää pienenä moduulina. Voit hyötyä korkean yhteenkuuluvuuden eduista pitämällä muuttujat mahdollisimman lähellä niitä käyttävää koodilohkoa.
Jos esimerkiksi muuttuja on olemassa vain lohkon laajuuden logiikan muodostamiseksi, julista ja tee muuttuja elossa vain kyseisen lohkon sisällä (käyttämällä
const
tailet
-ilmoitukset). Älä altista tätä muuttujaa ulkoisen lohkon laajuudelle, koska ulomman lohkon ei pitäisi välittää tästä muuttujasta.Yksi klassinen esimerkki tarpeettomasti pidennetystä muuttujien elämästä on
for
sykli toiminnon sisällä:index
,item
jalength
muuttujat ilmoitetaan funktion rungon alussa. Niitä käytetään kuitenkin vasta loppupuolella. Mikä on tämän lähestymistavan ongelma?Yläosassa olevan ilmoituksen ja
for
-lausekkeen käytön välillä muuttujatindex
,item
ei ole alustettu ja altistettuundefined
-palvelulle. Niiden elinkaari on kohtuuttoman pitkä koko toiminnossa.Parempi lähestymistapa on siirtää nämä muuttujat mahdollisimman lähelle niiden käyttöpaikkaa:
index
jaitem
-muuttujia on vain lauseenfor
lause lohkossa. Niillä ei ole merkitystäfor
-alueen ulkopuolella.
length
-muuttuja ilmoitetaan myös sen käytön lähteen läheisyydessä.Miksi muokattu versio on parempi kuin alkuperäinen? Katsotaanpa:
- Muuttujat eivät ole alttiina alustamattomalle tilalle, joten sinulla ei ole riskiä käyttää
undefined
- muuttujat mahdollisimman lähellä niiden käyttöpaikkaa lisäävät koodin luettavuutta
- Suuret yhtenäiset koodipalat on helpompi muokata ja purkaa tarvittaessa erillisiin toimintoihin
2.2 Pääsy olematon ominaisuus
Kun yrität käyttää ei-olemassa olevaa objektin ominaisuutta, JavaScript palauttaa
undefined
.Osoitetaan, että esimerkissä:
favoriteMovie
on objekti, jolla on yksi ominaisuustitle
. Olemassa olevan ominaisuudenactors
käyttäminen ominaisuuskäyttäjän avullafavoriteMovie.actors
arvioi arvonundefined
.Olemassa olevan ominaisuuden käyttö ei aiheuta virhettä. Ongelma ilmenee, kun yritetään saada tietoja olemattomasta ominaisuudesta, joka on yleisin
undefined
-loukku, joka näkyy tunnetussa virheilmoituksessaTypeError: Cannot read property <prop> of undefined
.Muutetaan edellistä koodinpätkää hieman
TypeError
-heiton havainnollistamiseksi:favoriteMovie
ei ole ominaisuuttaactors
, jotenfavoriteMovie.actors
arvioiundefined
.Tämän seurauksena
undefined
-arvon ensimmäisen kohteen käyttö lausekkeellafavoriteMovie.actors
heittääTypeError
.JavaScriptin sallivuus, joka sallii pääsyn olemattomiin ominaisuuksiin, on epädeterminismin lähde: ominaisuus voidaan asettaa tai ei. Hyvä tapa ohittaa tämä ongelma on rajoittaa objekti siten, että se on aina määrittänyt sillä olevat ominaisuudet.
Valitettavasti et usein hallitse objekteja. Tällaisilla kohteilla voi olla erilaiset ominaisuudet erilaisissa tilanteissa. Joten sinun on käsiteltävä kaikki nämä skenaariot manuaalisesti.
Toteutetaan toiminto
append(array, toAppend)
, joka lisää uusien elementtien joukon alkuun ja / tai loppuun.toAppend
-parametri hyväksyy objektin, jolla on ominaisuuksia:-
first
: elementti lisätäänarray
-
last
: elementti lisättyarray
.
Funktio palauttaa uuden taulukon esiintymän muuttamatta alkuperäistä taulukkoa.
append()
: n ensimmäinen, hieman naiivi, versio voi näyttää tältä:Koska
toAppend
-objekti voi jättääfirst
– tailast
-ominaisuudet pois, on pakollinen tarkistaa, onko näitä ominaisuuksia olemassatoAppend
.Sivuston käyttöoikeudet arvioi arvoksi
undefined
, jos ominaisuutta ei ole. Ensimmäinen kiusaus tarkistaa, onkofirst
vailast
ominaisuuksia olemassa, on tarkistaa neundefined
. Tämä suoritetaan ehdollisissa ehdoissaif(toAppend.first){}
jaif(toAppend.last){}
…Ei niin nopeasti. Tällä lähestymistavalla on haittapuoli.
undefined
sekäfalse
,null
,0
,NaN
ja""
ovat väärät arvot.append()
: n nykyisessä toteutuksessa toiminto ei salli väärennettyjen elementtien lisäämistä:Seuraavissa vihjeissä selitetään, kuinka kiinteistön olemassaolo voidaan tarkistaa oikein.
Vihje 3: Tarkista kiinteistön olemassaolo
Onneksi JavaScript tarjoaa joukko tapoja selvittää, onko objektilla tietty ominaisuus:
-
obj.prop !== undefined
: vertaaundefined
suoraan -
typeof obj.prop !== "undefined"
: vahvista ominaisuuden arvon tyyppi -
obj.hasOwnProperty("prop")
: tarkista, objektilla on oma ominaisuus -
"prop" in obj
: tarkista onko objektilla oma vai peritty ominaisuus
Suosittelen käytä
in
-operaattoria. Sillä on lyhyt ja suloinen syntakse.in
-operaattorin läsnäolo viittaa selkeään tarkoitukseen tarkistaa, onko objektilla tietty ominaisuus, pääsemättä käyttämättä todellista ominaisuusarvoa.obj.hasOwnProperty("prop")
on myös hieno ratkaisu. Se on hieman pidempi kuinin
-operaattori ja tarkistaa vain kohteen omissa ominaisuuksissa.Parannetaan
append(array, toAppend)
-funktiota käyttämälläin
-operaattoria:"first" in toAppend
(ja"last" in toAppend
) ontrue
onko vastaava ominaisuus olemassa,false
muuten.in
-operaattori korjaa väärennettyjen elementtien0
jafalse
. Nyt näiden elementtien lisääminen-kohdan alkuun ja loppuun tuottaa odotetun tuloksen
.
Vinkki 4: Uudelleenjärjestely objektin ominaisuuksien käyttämiseksi
Kun käytät objekti-ominaisuutta, joskus on tarpeen asettaa oletusarvo, jos ominaisuutta ei ole.
Voit käyttää
in
-tapaa kolminkertaisen operaattorin kanssa tämän saavuttamiseksi:Kolmen operaattorin syntaksista tulee pelottava, kun tarkistettavien ominaisuuksien määrä kasvaa. Jokaiselle ominaisuudelle sinun on luotava uusi koodirivi oletusarvojen käsittelemiseksi, mikä lisää samanlaisen näköisten kolmion operaattoreiden rumaa seinää.
Jos haluat käyttää tyylikkäämpää lähestymistapaa, tutustu upeaan ES2015-ominaisuuteen, jota kutsutaan kohteen tuhoamiseksi.
Kohteen tuhoaminen mahdollistaa objektin ominaisuusarvojen sisäisen purkamisen suoraan muuttujiin ja oletusarvon asettamisen, jos ominaisuutta ei ole olemassa. Kätevä syntaksin välttämiseksi käsittelemään suoraan
undefined
.Ominaisuuden poiminta on todellakin nyt tarkka:
Jos haluat nähdä asiat toiminnassa, määritellään hyödyllinen funktio, joka kietoo merkkijonon lainausmerkkeihin.
quote(subject, config)
hyväksyy ensimmäisen argumentin pakattavaksi merkkijonoksi. Toinen argumentticonfig
on objekti, jolla on ominaisuudet:Kohteen tuhoamisen edut soveltamalla toteutetaan
quote()
:const { char = """, skipIfQuoted = true } = config
uudelleenjärjestelymääritys yhdellä rivillä poimii ominaisuudetchar
jaskipIfQuoted
kohteestaconfig
-objekti.
Jos joitain ominaisuuksia puuttuu objektistaconfig
, tuhoamisominaisuus määrittää oletusarvot :"""
kohteellechar
jafalse
kohteelleskipIfQuoted
.Onneksi toiminnossa on vielä parantamisen varaa.
Siirretään destruktion määritys parametrit-osioon. Ja aseta parametrille
config
oletusarvo (tyhjä objekti{ }
) ohittaaksesi toisen argumentin, kun oletusasetukset ovat riittävät.Tyhjentävä määritys korvaa parametrin
config
funktion allekirjoituksessa. Pidän siitä:quote()
muuttuu yhdellä rivillä lyhyempi.= {}
tuhoamismäärityksen oikealla puolella varmistaa, että tyhjää objektia käytetään, jos toista argumenttia ei ole määritelty lainkaanquote("Sunny day")
.Kohteen tuhoaminen on tehokas ominaisuus, joka hoitaa tehokkaasti ominaisuuksien poiminnan esineistä. Pidän mahdollisuudesta määrittää palautettava oletusarvo, kun käytettyä ominaisuutta ei ole. Tämän seurauksena vältät
undefined
ja sen ympärillä olevaa hässäkkää.Vinkki 5: Täytä objekti oletusominaisuuksilla
Jos jokaiselle ominaisuudelle ei tarvitse luoda muuttujia, kuten uudelleenjärjestelymääritys tekee, osa ominaisuuksista puuttuva objekti voidaan täyttää oletusarvoilla.
ES2015
Object.assign(target, source1, source2, ...)
kopioi kaikkien lukemattomien omien ominaisuuksien arvot yhdestä tai useammasta lähdeobjektista kohdeobjektiin. Funktio palauttaa kohdeobjektin.Sinun on esimerkiksi käytettävä
unsafeOptions
-objektin ominaisuuksia, jotka eivät aina sisällä kaikkia sen ominaisuuksia.Jotta vältetään
undefined
, kun yritetään käyttää ei-ominaisuutta osoitteestaunsafeOptions
, tehdään joitain muutoksia:- Määritä objekti
defaults
, jolla on oletusominaisuudet. - Kutsu
Object.assign({ }, defaults, unsafeOptions)
rakentamaan uusi objektioptions
. Uusi objekti vastaanottaa kaikki ominaisuudet kohteestaunsafeOptions
, mutta puuttuvat kohteet otetaan kohteestadefaults
.
unsafeOptions
sisältää vain ominaisuudenfontSize
.defaults
-objekti määrittää oletusarvot ominaisuuksillefontSize
jacolor
.Object.assign()
ottaa ensimmäisen argumentin kohdeobjektiksi{}
. Kohdeobjekti vastaanottaafontSize
-omaisuuden arvon lähdeobjektiltaunsafeOptions
. Jacolor
-ominaisuuden arvo lähdeobjektistadefaults
, koskaunsafeOptions
ei sisälläcolor
.Lähdeobjektien luettelointijärjestyksellä on merkitystä: myöhemmät lähdeobjektiominaisuudet korvaavat aikaisemmat.
Voit nyt käyttää kaikkia
options
-objektin ominaisuuksia, mukaan lukienoptions.color
, joka ei ollut käytettävissä ryhmässäunsafeOptions
aluksi.Onneksi on olemassa helpompi vaihtoehto objektin täyttämiseksi oletusominaisuuksilla.Suosittelen leviämisominaisuuksien käyttämistä objektin alustusohjelmissa.
Object.assign()
-kutsujen sijasta kopioi kohdeobjektiin kaikki objektin levityssyntaksilla kaikki omat ja lueteltavat ominaisuudet lähde-objekteista: objektin alustusohjelma levittää ominaisuuksiadefaults
– jaunsafeOptions
-lähde-objekteista. Lähdeobjektien määritysjärjestys on tärkeä: myöhemmät lähdeobjektiominaisuudet korvaavat aikaisemmat.Keskeneräisen objektin täyttäminen oletusarvoisilla ominaisuusarvoilla on tehokas strategia tehdä koodistasi turvallinen ja kestävä. Tilanteesta riippumatta, objekti sisältää aina kaikki ominaisuudet:
undefined
ei voida luoda.Bonusvinkki: nolla yhdistäminen
Operaattori nolla yhdistäminen arvioi oletusarvon, kun sen operandi on
undefined
tainull
:Nullan yhdistämisen operaattorilla on helppo käyttää objektiominaisuutta samalla kun sillä on oletusarvo, kun tämä ominaisuus on
undefined
tainull
:styles
objektilla ei ole ominaisuuttacolor
, jotenstyles.color
ominaisuuden käyttöoikeus onundefined
.styles.color ?? "black"
arvioi oletusarvoksi"black"
.styles.fontSize
on18
, joten tyhjä yhdistynyt operaattori arvioi ominaisuuden arvoksi18
.2.3 Toimintoparametrit
Funktion parametrit ovat implisiittisesti oletusarvoisesti
undefined
.Yleensä tiettyyn parametrimäärällä määritetty funktio tulisi kutsua samalla argumenttimäärällä. Silloin parametrit saavat odotetut arvot:
Kun
multiply(5, 3)
, parametrita
jab
saavat5
ja3
arvot. Kertolasku lasketaan odotetulla tavalla:5 * 3 = 15
.Mitä tapahtuu, kun jätät argumentin pois kutsusta? Vastaavasta parametrista funktion sisällä tulee
undefined
.Muutetaan hieman edellistä esimerkkiä kutsumalla funktio vain yhdellä argumentilla:
Kutsu
multiply(5)
suoritetaan yhdellä argumentilla: tulosa
-parametri on5
, muttab
-parametri onundefined
.Vinkki 6: Käytä parametrin oletusarvoa.
Joskus funktio ei vaadi kaikkia argumentteja joukossa. Voit asettaa oletusarvot parametreille, joilla ei ole arvoa.
Palataksemme edelliseen esimerkkiin, tehkäämme parannus. Jos
b
-parametri onundefined
, anna sen oletusarvoisesti2
:Funktio kutsutaan yhdellä argumentilla
multiply(5)
. Aluksia
-parametri on2
jab
onundefined
.
Ehdollinen käsky tarkistaa, onkob
undefined
. Jos näin tapahtuu,b = 2
-määritys asettaa oletusarvon.Vaikka annettu oletusarvojen osoittamistapa toimii, en suosittele vertailua suoraan
undefined
-versioon. Se on monipuolinen ja näyttää hakkeroinnilta.Parempi lähestymistapa on käyttää ES2015-oletusparametrien ominaisuutta. Se on lyhyt, ilmaiseva eikä sisällä suoria vertailuja
undefined
: iin.Oletusarvon lisääminen parametriin
b = 2
näyttää paremmalta:b = 2
funktion allekirjoituksessa varmistaa, että josb
onundefined
, parametrin oletusarvo on2
.ES2015-oletusparametrien ominaisuus on intuitiivinen ja ilmeikäs. Käytä sitä aina oletusarvojen asettamiseen valinnaisille parametreille.
2.4 Funktion palautusarvo
Epäsuorasti, ilman lauseketta
return
, JavaScript-funktio palauttaaundefined
.Toiminto, jolla ei ole
return
-lauseke palauttaa implisiittisestiundefined
:square()
-funktio ei palauta laskentatuloksia. Funktion kutsutulos onundefined
.Sama tilanne tapahtuu, kun
return
-lauseke on läsnä, mutta ilman lähistöllä olevaa lauseketta:return;
-lauseke suoritetaan, mutta se ei palauta lauseketta. Kutsutulos on myösundefined
.Tietenkin ilmaiseminen lähellä
return
palautettava lauseke toimii odotetulla tavalla:Nyt funktion kutsuksi arvioidaan
4
, joka on2
neliö.Vihje 7: Älä luota automaattiseen puolipisteen lisäykseen.
Seuraavan JavaScript-lauseiden luettelon on lopputtava puolipisteillä (
;
) :- tyhjä lause
-
let
,const
,var
,import
,export
-ilmoitukset - lauseke
-
debugger
lause -
continue
lause,break
lause -
throw
-lauseke -
return
-lauseke
Jos käytät yhtä yllä olevista lauseista, muista ilmoittaa puolipiste lopussa:
Molempien lopussa
let
-ilmoitus jareturn
-lauseke pakollinen puolipiste kirjoitetaan.Mitä tapahtuu, kun et halua ilmoittaa näitä puolipisteet? Tällaisessa tilanteessa ECMAScript tarjoaa automaattisen puolipisteiden lisäysmekanismin (ASI), joka lisää sinulle puuttuvat puolipisteet.
ASI: n avulla voit poistaa puolipisteet edellisestä esimerkistä:
Yllä oleva teksti on kelvollinen JavaScript-koodi. Puuttuvat puolipisteet lisätään automaattisesti sinulle.
Ensi silmäyksellä se näyttää melko lupaavalta. ASI-mekanismin avulla voit ohittaa tarpeettomat puolipisteet. Voit tehdä JavaScript-koodista pienemmän ja helpommin luettavan.
ASI on luonut yhden pienen, mutta ärsyttävän ansan. Kun uusi viiva on
return
ja palautetun lausekkeenreturn \n expression
välissä, ASI lisää puolipisteen automaattisesti uuden rivinreturn; \n expression
.Mitä funktion sisällä tarkoittaa
return;
-lausekkeen merkitseminen? Funktio palauttaaundefined
. Jos et tiedä yksityiskohtaisesti ASI: n mekanismia, odottamaton palautettuundefined
on harhaanjohtava.Tutkitaan esimerkiksi
getPrimeNumbers()
-kutsun palautettua arvoa:return
-lausekkeen ja taulukon kirjaimellisen lausekkeen välissä on uusi rivi. JavaScript lisää puolipisteen automaattisestireturn
jälkeen ja tulkitsee koodin seuraavasti:Lauseke
return;
saa funktiongetPrimeNumbers()
palauttamaanundefined
odotetun taulukon sijasta.Ongelma ratkaistaan poistamalla uusi rivi
return
ja taulukon literaali välillä:Suosittelen tutkimaan, kuinka automaattinen puolipisteen lisäys toimii tällaisten tilanteiden välttämiseksi.
Älä tietenkään aseta uutta riviä
return
ja palautetun lausekkeen väliin.2.5 void -operaattori
void <expression>
arvioi lausekkeen ja palauttaaundefined
tuloksesta riippumatta arvioinnin.Operaattorin
void
yksi käyttötapaus on estää lausekkeen arviointi arvoonundefined
vedoten arvioinnin joihinkin sivuvaikutuksiin.3. undefined taulukoissa
Saat
undefined
, kun käytät matriisielementtiä, jonka hakemisto on rajojen ulkopuolella.colors
taulukossa on 3 elementtiä, joten kelvolliset hakemistot ovat0
,1
ja2
.Koska hakemistoissa
5
ja-1
ei ole taulukkoelementtejä, käyttöoikeudetcolors
jacolors
ovatundefined
.JavaScriptissä saatat kohdata niin sanottuja harvoja taulukoita. Opinnäytteet ovat taulukoita, joissa on aukkoja, ts. Joissakin hakemistoissa ei ole määritelty elementtejä.
Kun harvan taulukon sisällä on aukko (alias tyhjä paikka), saat myös
undefined
.Seuraava esimerkki luo harvoja taulukoita ja yrittää käyttää niiden tyhjiä paikkoja:
sparse1
luodaan kutsumallaArray
konstruktori, jonka ensimmäinen argumentti on numeerinen.Siinä on 3 tyhjää paikkaa.sparse2
luodaan taulukon kirjaimella, josta puuttuu toinen elementti.Missä tahansa näistä harvoista matriiseista tyhjän paikan käyttö arvioi
undefined
.Kun työskentelet matriisien kanssa, välttää
undefined
, muista käyttää kelvollisia taulukkoindeksejä ja estää harvojen matriisien luominen.4. Määrittelemättömän ja tyhjän välinen ero
Mikä on tärkein ero
undefined
janull
? Molemmat erityisarvot tarkoittavat tyhjää tilaa.undefined
edustaa muuttujan arvoa, jota ei ole vielä alustettu, kun taasnull
edustaa tarkoituksellista kohteen puuttumista.Tutkitaan eräiden esimerkkien eroa.
Muuttuja
number
on määritelty ei kuitenkaan määritetä alkuarvoon:number
muuttuja onundefined
, mikä osoittaa alustamattoman muuttujan.Sama alustamaton käsite tapahtuu, kun ei-olemassa olevaa objektin ominaisuutta käytetään:
Koska
lastName
-ominaisuutta ei ole kohdassaobj
, JavaScript arvioiobj.lastName
arvoksiundefined
.Toisella puolella tiedät, että muuttuja odottaa objektia. Mutta jostain syystä et voi instantisoida kohdetta. Tällöin
null
on puuttuvan objektin merkityksellinen indikaattori.Esimerkiksi
clone()
on funktio, joka kloonaa tavallisen JavaScript-objektin. Funktion odotetaan palauttavan objektin:Kuitenkin
clone()
voidaan kutsua ei-objekti-argumentilla:15
tainull
. Tällöin funktio ei voi luoda kloonia, joten se palauttaa puuttuvan objektin ilmaisimennull
.typeof
-operaattori erottaaundefined
janull
:Myös tiukka laatuoperaattori
===
erottaa lähettäjältänull
:5. Päätelmä
undefined
olemassaolo on seurausta JavaScriptin sallivasta luonteesta, joka sallii seuraavien käyttämisen:- alustamattomat muuttujat
- olemattomat objektiominaisuudet tai -menetelmät
- rajat ylittävistä hakemistoista, joilla pääset matriisielementteihin
- mitään funktiota, joka ei palauta mitään, kutsutun tuloksen
Vertailu suoraan kohtaan
undefined
on vaarallista, koska luotat edellä mainittuun sallittuun mutta lannistettuun käytäntöön.Tehokas strategia on vähentää
undefined
-avainsanan ulkonäköä koodissasi soveltamalla hyviä tapoja, kuten:- vähennä alustamattomien muuttujien käyttöä
- tehdä muuttujista elinkaari lyhyt ja lähellä niiden lähdettä
- aina kun mahdollista antaa alkuperäiset arvot muuttujille
- suosivat
const
, muuten käytälet
- käytä oletusarvoja merkityksettömiin toimintoparametreihin
- vahvista ominaisuudet olemassaolo tai täytä vaaralliset objektit oletusominaisuuksilla
- vältä harvojen taulukoiden käyttöä
Onko hyvä, että Javascriptissa on molemmat
undefined
janull
edustamaan tyhjiä arvoja? - Muuttujat eivät ole alttiina alustamattomalle tilalle, joten sinulla ei ole riskiä käyttää