7 tipp a undefined JavaScript használatához
A modern nyelvek többségének, mint a Ruby, a Python vagy a Java, egyetlen null értéke van (nil
vagy null
), ami ésszerű megközelítésnek tűnik.
De a JavaScript más.
null
, de undefined
is, a JavaScript üres értékeit képviseli. Tehát mi a pontos különbség közöttük?
A rövid válasz az, hogy a JavaScript-tolmács undefined
-et ad vissza, ha olyan változóhoz vagy objektumtulajdonsághoz fér hozzá, amely még nincs inicializálva. Például:
A másik oldalon a null
hiányzó objektumot képvisel referencia. A JavaScript nem inicializálja a null
változókat vagy objektumtulajdonságokat.
Egyes natív módszerek, például az String.prototype.match()
visszaadhatják az null
elemeket egy hiányzó objektum jelölésére. Vessen egy pillantást a mintára:
Mivel a JavaScript megengedő, a fejlesztők megkísérlik elérni az inicializálatlan értékeket. Én is bűnös vagyok ilyen rossz gyakorlatok miatt.
Az ilyen kockázatos műveletek gyakran undefined
kapcsolódó hibákat generálnak:
-
TypeError: "undefined" is not a function
-
TypeError: Cannot read property "<prop-name>" of undefined
- és hasonló típusú hibák.
A JavaScript-fejlesztő megérti ennek a poénnak az iróniáját :
Az ilyen hibák csökkentése érdekében meg kell értenie azokat az eseteket, amikor undefined
generálódik. Fedezzük fel undefined
és annak hatását a kódbiztonságra.
1. Mi nincs meghatározva
A JavaScript-nek 6 primitív típusa van:
És külön objektumtípus: {name: "Dmitri"}
, .
6 primitív típus közül a undefined
egy speciális érték, amelynek saját típusa Undefined. Az ECMAScript specifikáció szerint:
Meghatározatlan értékű primitív értéket használunk, ha egy változóhoz nincs hozzárendelve érték.
A szabvány egyértelműen meghatározza, hogy undefined
fog kapni, ha nem inicializált változókat, nem létező objektumtulajdonságokat ér el, nem létező tömb elemek és hasonlóak.
Néhány példa:
A fenti példa bemutatja, hogy:
- egy inicializálatlan változó
number
- nem létező objektumtulajdonság
movie.year
- vagy nem létező tömb elem
movies
értéke undefined
lesz.
Az ECMAScript specifikáció meghatározza a undefined
érték típusát:
A meghatározatlan típus olyan típus, amelynek egyedüli értéke a
undefined
érték.
Ebben az értelemben a typeof
operátor "undefined"
karakterláncot ad vissza egy undefined
értékhez:
Természetesen a typeof
jól működik annak ellenőrzésére, hogy egy változó tartalmaz-e undefined
értéket:
2. Definíciókat létrehozó forgatókönyvek
2.1 Inicializálatlan változó
A deklarált változó, de még nincs hozzárendelve értékkel (inicializálatlan), alapértelmezés szerint
undefined
.
Egyszerű és egyszerű:
myVariable
van deklarálva, és még nincs hozzárendelve értékkel. A változó elérése a következőt értékeli: undefined
.
Az inicializálatlan változók problémáinak megoldására hatékony megközelítés lehetõség szerint kezdõ értéket rendelni. Minél kevesebb a változó létezik inicializálatlan állapotban, annál jobb.
Ideális esetben azonnal hozzárendel egy értéket a const myVariable = "Initial value"
deklaráció után. De ez nem mindig lehetséges.
1. tipp: Kedvence const
, különben használja a let
elemet, de búcsúzzon el var
Véleményem szerint az ECMAScript 2015 egyik legjobb tulajdonsága a változók deklarálásának új módja const
és . Nagy előrelépés.
const
és let
blokk hatókörbe kerül (ellentétben a régebbi hatókörű var
) és egy ideiglenes holt zónában léteznek a deklarációs sorig.
Javaslom a const
változót, ha az értéke nem fog változni. Megállapíthatatlan kötést hoz létre.
A const
egyik szép tulajdonsága, hogy kezdeti értéket kell rendelnie a const myVariable = "initial"
változóhoz. A változó nincs kitéve az inicializálatlan állapotnak, és a undefined
elérése lehetetlen.
Ellenőrizzük a függvényt, amely igazolja, hogy egy szó palindróma:
length
és half
változókhoz egy értéket rendelünk egyszer. Ésszerűnek tűnik const
nek nyilvánítani őket, mivel ezek a változók nem változnak.
Használja a let
deklarációt azoknak a változóknak, amelyek értéke megváltozhat. Amikor csak lehetséges, azonnal rendeljen hozzá egy kezdőértéket, pl. let index = 0
.
Mi van a régi iskolával var
? Javaslatom, hogy hagyja abba a használatát.
var
deklarációs probléma a függvény hatókörén belüli változó emelése. Deklarálhat egy var
változót valahol a függvény hatókörének végén, de mégis elérheti a deklaráció előtt: és kap egy undefined
.
myVariable
elérhető, és még a deklarációs sor előtt is tartalmaz undefined
-t: var myVariable = "Initial value"
.
Ezzel szemben egy const
vagy let
változó nem érhető el a deklarációs sor előtt – a változó a nyilatkozat előtt időbeli holt zónában van. Ez jó, mert kevesebb esélye van egy undefined
elérésére.
A fenti példa a következővel frissült: let
(ehelyett var
) értéke ReferenceError
-et dob, mert az időbeli holt zónában lévő változó nem érhető el.
A const
változatlan kötésekhez való használatának ösztönzése vagy a let
használatának ellenkezője biztosítja az inicializálatlan megjelenést csökkentő gyakorlatot változó.
2. tipp: Növelje a kohéziót
A kohézió jellemzi, hogy a modul elemei (névtér, osztály, módszer, kódblokk) milyen mértékben tartoznak egymáshoz. A kohézió lehet magas vagy alacsony.
Előnyös a magas kohéziójú modul, mert egy ilyen modul elemei kizárólag egyetlen feladatra összpontosítanak. Ez a modult:
- Koncentrált és érthető: könnyebben érthető, mit csinál a modul
- Karbantartható és könnyebben átalakítható: a modul változása kevesebb modult érint
- Újrafelhasználható: egyetlen feladatra összpontosítva megkönnyíti a modul újrafelhasználását.
- Tesztelhető: könnyebben tesztelné az egyetlen feladatra összpontosító modult. p>
A jól megtervezett rendszer jellemzője a laza csatolással járó magas kohézió.
A kódblokk kis modulnak tekinthető. Ahhoz, hogy profitálhasson a magas kohézió előnyeiből, tartsa a változókat a lehető legközelebb az őket használó kódblokkhoz.
Például, ha egy változó kizárólag a blokk hatókörének logikájának kialakításához létezik, akkor deklarálja és csak a blokkon belül éltesse a változót (
const
vagylet
nyilatkozatok). Ne tegye ki ezt a változót a blokk külső hatókörének, mivel a külső blokknak nem kell törődnie ezzel a változóval.A változók szükségtelenül meghosszabbított élettartamának egyik klasszikus példája a ciklus egy függvény belsejében:
index
,item
éslength
változókat a függvénytest elején deklaráljuk. Ezeket azonban csak a vége felé használják. Mi a probléma ezzel a megközelítéssel?A tetején lévő deklaráció és a
for
utasításban szereplőindex
,item
inicializálatlanok ésundefined
vannak kitéve. Indokolatlanul hosszú életciklusuk van a teljes funkciókörben.Jobb megközelítés, ha ezeket a változókat a lehető legközelebb helyezzük a felhasználási helyükhöz:
index
ésitem
változók csak afor
utasítás blokk hatókörében léteznek. Nincs jelentésük afor
kívül.
Alength
változót a használat forrásához is közel deklarálják.Miért jobb a módosított verzió, mint az eredeti? Lássuk:
- A változók nincsenek kitéve inicializálatlan állapotnak, így nincs kockázata a
undefined
- a felhasználási helyükhöz lehető legközelebb eső változók növelik a kód olvashatóságát
- A nagy összetartó kóddarabokat könnyebb átalakítani és szükség esetén külön funkciókba vonni egy nem létező tulajdonság
Nem létező objektumtulajdon elérésekor a JavaScript visszaadja az
undefined
értéket.Bemutassuk ezt egy példában:
favoriteMovie
egyetlen tulajdonsággal rendelkező objektumtitle
. Egy nem létező tulajdonság eléréseactors
egy tulajdonság-hozzáférés használatávalfavoriteMovie.actors
undefined
. / p>Nem létező tulajdonság elérése nem okoz hibát. A probléma akkor jelentkezik, amikor a nem létező tulajdonságból próbál adatokat szerezni, amely a leggyakoribb
undefined
csapda, amelyet a jól ismertTypeError: Cannot read property <prop> of undefined
.Módosítsuk kissé az előző kódrészletet egy
TypeError
dobás szemléltetése érdekében:favoriteMovie
nem rendelkezik aactors
tulajdonsággal, tehátfavoriteMovie.actors
undefined
értéket kap.Ennek eredményeként a
undefined
érték első elemének elérése afavoriteMovie.actors
kifejezés használatávalTypeError
.A JavaScript megengedő jellege, amely lehetővé teszi a nem létező tulajdonságok elérését, a nemdeterminizmus forrása: lehet, hogy a tulajdonság be van állítva vagy sem. A probléma kikerülésének jó módja annak korlátozása, hogy az objektum mindig meghatározza a birtokában lévő tulajdonságokat.
Sajnos gyakran nem tudja irányítani az objektumokat. Az ilyen objektumok eltérő tulajdonságokkal rendelkezhetnek különböző forgatókönyvekben. Tehát ezeket a forgatókönyveket manuálisan kell kezelnie.
Vezessünk be egy
append(array, toAppend)
függvényt, amely új elemek tömbjének elején és / vagy végén ad hozzá. AtoAppend
paraméter elfogad egy tulajdonságú objektumot:-
first
: aarray
-
last
: az elem beillesztve aarray
.
A függvény új tömbpéldányt ad vissza, az eredeti tömb megváltoztatása nélkül.
A
append()
első, kissé naiv verziója így nézhet ki:Mivel
toAppend
objektum elhagyhatja afirst
vagy alast
tulajdonságokat, kötelező ellenőrizni, hogy léteznek-e ezek a tulajdonságok a .A tulajdonság-hozzáférő
undefined
-nek értékeli, ha a tulajdonság nem létezik. Az első kísértés annak ellenőrzésére, hogy vannak-efirst
vagylast
tulajdonságok, az az, hogy ellenőrizze őket aundefined
. Ezt feltételesif(toAppend.first){}
ésif(toAppend.last){}
…feltételekkel hajtják végre. Ennek a megközelítésnek van hátránya.
undefined
, valamintfalse
,null
,0
,NaN
és""
hamis értékek.A
append()
jelenlegi megvalósításában a függvény nem engedélyezi hamis elemek beillesztését:A következő tippek elmagyarázzák, hogyan lehet helyesen ellenőrizni az ingatlan létezését.
3. tipp: Ellenőrizze az ingatlan létét
Szerencsére a JavaScript kínál egy csomó módszer annak megállapítására, hogy az objektum rendelkezik-e meghatározott tulajdonsággal:
-
obj.prop !== undefined
: összehasonlítás aundefined
közvetlenül -
typeof obj.prop !== "undefined"
: ellenőrizze a tulajdonság érték típusát -
obj.hasOwnProperty("prop")
: ellenőrizze, hogy a az objektumnak van saját tulajdonsága -
"prop" in obj
: ellenőrizze, hogy az objektum rendelkezik-e saját vagy örökölt tulajdonsággal
Javaslom: használja a
in
operátort. Rövid és édes szintaxisa van. Azin
operátor jelenléte egyértelmű szándékot javasol annak ellenőrzésére, hogy az objektum rendelkezik-e konkrét tulajdonsággal, a tényleges tulajdonságérték elérése nélkül.obj.hasOwnProperty("prop")
is jó megoldás. Ez valamivel hosszabb, mint ain
operátor, és csak az objektum saját tulajdonságaiban ellenőrzi.Javítsuk a
append(array, toAppend)
függvényt ain
operátor használatával:"first" in toAppend
(és"last" in toAppend
)true
hogy létezik-e a megfelelő tulajdonság,false
különben.in
operátor kijavítja a hibát hamis elemek beillesztésével0
ésfalse
. Ha ezeket az elemeket hozzáadja aelejéhez és végéhez, akkor a várt eredmény
lesz.
4. tipp: Szerkezetátalakítás az objektumtulajdonságok eléréséhez
Az objektumtulajdonság elérésekor néha alapértelmezett értéket kell megadni, ha a tulajdonság nem létezik.
Használhatja a
in
terner operátorral együtt ennek megvalósításához:A háromszintű operátor szintaxisa ijesztővé válik, amikor az ellenőrzendő tulajdonságok száma növekszik. Minden tulajdonsághoz létre kell hozni egy új kódsort az alapértelmezések kezeléséhez, növelve a hasonló kinézetű háromszintű operátorok csúnya falát.
Az elegánsabb megközelítés érdekében ismerkedjünk meg egy nagyszerű ES2015 funkcióval, amelyet objektum-roncsolásnak hívunk.
Az objektum roncsolása lehetővé teszi az objektumtulajdonság-értékek inline kibontását közvetlenül változókba, és alapértelmezett érték beállítását, ha a tulajdonság nem létezik. Kényelmes szintaxis a
undefined
közvetlen kezelésének elkerülése érdekében.Valójában a tulajdonság kibontása most már pontos:
A dolgok működésének megtekintéséhez definiáljunk egy hasznos függvényt, amely idézőjelekbe tekeri a karakterláncot.
quote(subject, config)
elfogadja az első argumentumot beillesztendő karakterláncként. Aconfig
második argumentum egy tulajdonságú objektum:Az objektum rombolásának előnyeit alkalmazva valósítsuk meg a
quote()
:const { char = """, skipIfQuoted = true } = config
egy soron belüli strukturálás hozzárendeli achar
ésskipIfQuoted
aconfig
objektumból.
Ha néhány tulajdonság hiányzik aconfig
objektumból, a destrukturálási hozzárendelés megadja az alapértelmezett értékeket :"""
char
ésfalse
eseténskipIfQuoted
.Szerencsére a funkción még van mit javítani.
Helyezzük át a romboló hozzárendelést a paraméterek szakaszba. És állítson be egy alapértelmezett értéket (egy üres objektumot
{ }
) aconfig
paraméterhez, hogy a második argumentumot kihagyja, ha az alapértelmezett beállítások elegendőek.A romboló hozzárendelés a
config
paramétert helyettesíti a függvény aláírásában. Tetszik:quote()
eggyel rövidebb lesz.= {}
a romboló hozzárendelés jobb oldalán biztosítja, hogy egy üres objektumot használjanak, ha a második argumentum egyáltalán nincs megadvaquote("Sunny day")
.Az objektum roncsolása hatékony funkció, amely hatékonyan kezeli az objektumok tulajdonságainak kinyerését. Tetszik a lehetőség, hogy megadjon egy alapértelmezett értéket, amelyet vissza kell adni, ha a hozzáférett tulajdonság nem létezik. Ennek eredményeként elkerüli a
undefined
t és a körülötte lévő problémákat.5. tipp: Töltse ki az objektumot alapértelmezett tulajdonságokkal.
Ha nem szükséges minden tulajdonsághoz változót létrehozni, ahogy a romboló hozzárendelés teszi, akkor az egyes tulajdonságokat elmulasztó objektum kitölthető alapértelmezett értékekkel.
Az ES2015
Object.assign(target, source1, source2, ...)
átmásolja az összes megszámlálható saját tulajdonság értékét egy vagy több forrásobjektumból a célobjektumba. A függvény visszaadja a célobjektumot.Például hozzáférnie kell az
unsafeOptions
objektum tulajdonságaihoz, amelyek nem mindig tartalmazzák a teljes tulajdonságkészletet.A
undefined
elkerülése érdekében, amikor egy nem létező tulajdonsághoz hozzáfér aunsafeOptions
címről, végezzünk néhány beállítást:- Adjon meg egy objektumot
defaults
, amely az alapértelmezett tulajdonságértékeket tartalmazza - Hívja az
Object.assign({ }, defaults, unsafeOptions)
elemet az építkezéshez egy új objektumoptions
. Az új objektum az összes tulajdonságot megkapja a következőtől:unsafeOptions
, de a hiányzóakat adefaults
fájlok veszik át.
unsafeOptions
csakfontSize
tulajdonságot tartalmaz. Adefaults
objektum meghatározza azfontSize
éscolor
tulajdonságok alapértelmezett értékeit.Object.assign()
az első argumentumot célobjektumként veszi fel{}
. A célobjektum megkapja azfontSize
tulajdonság értékét azunsafeOptions
forrásobjektumtól. És acolor
tulajdonság értéke adefaults
forrásobjektumból, mert aunsafeOptions
nem tartalmazcolor
.A forrásobjektumok felsorolásának sorrendje számít: a későbbi forrásobjektum-tulajdonságok felülírják a korábbiakat.
Mostantól biztonságosan hozzáférhet a
options
objektum bármely tulajdonságához, beleértve aoptions.color
fájlt, amely nem volt elérhető aunsafeOptions
kezdetben.Szerencsére létezik egy egyszerűbb alternatíva az objektum alapértelmezett tulajdonságokkal történő kitöltésére.Azt javaslom, hogy az objektum inicializátorokban használja a spread tulajdonságokat.
A
Object.assign()
meghívás helyett az objektumterjesztés szintaxisával másolja a célobjektumba a forrásobjektumok összes saját és megszámlálható tulajdonságát:az objektum inicializálója terjeszti a tulajdonságokat
defaults
ésunsafeOptions
forrásobjektumokból. Fontos a forrásobjektumok megadásának sorrendje: a későbbi forrásobjektum-tulajdonságok felülírják a korábbiakat.A hiányos objektum alapértelmezett tulajdonságértékekkel történő kitöltése hatékony stratégia a kód biztonságos és tartósvá tételéhez. A helyzettől függetlenül az objektum mindig a tulajdonságok teljes készletét tartalmazza: és
undefined
nem hozható létre.Bónusztipp: nullás koaleszszió
Az operátor nullaszerű koalízálás alapértelmezett értéket vesz fel, ha az operandus
undefined
vagynull
:A nulla koaleszkáló operátor kényelmesen hozzáférhet egy objektum tulajdonságához, miközben alapértelmezett értéke van, amikor ez a tulajdonság
undefined
vagynull
:styles
objektum nem rendelkezik acolor
tulajdonsággal, tehátstyles.color
a tulajdonság-hozzáférésundefined
.styles.color ?? "black"
az alapértelmezett értéket"black"
értékeli.styles.fontSize
18
, tehát a nullás koalézáló operátor a .2.3 Funkcióparaméterek
A függvényparaméterek hallgatólagosan alapértelmezés szerint
undefined
.Általában egy meghatározott számú paraméterrel definiált függvényt kell azonos számú argumentummal meghívni. Ekkor kapják meg a paraméterek a várt értékeket:
Amikor
multiply(5, 3)
, aa
ésb
paraméterek5
és3
értékeket. A szorzást a várt módon számolják:5 * 3 = 15
.Mi történik, ha kihagy egy argumentumot a meghíváskor? A függvényen belüli megfelelő paraméter
undefined
lesz.Módosítsuk kissé az előző példát a függvény egyetlen argumentummal történő meghívásával:
Az invokáció A
multiply(5)
egyetlen argumentummal hajtódik végre: ennek eredményeként aa
paraméter5
, de a Ab
paraméterundefined
.6. tipp: Használja az alapértelmezett paraméterértéket.
Néha egy függvényhez nincs szükség teljes argumentumkészletre a meghíváskor. Alapértékeket állíthat be azokhoz a paraméterekhez, amelyeknek nincs értéke.
Felidézve az előző példát, tegyünk javulást. Ha a
b
paraméterundefined
, hagyja alapértelmezés szerint2
:A függvény egyetlen argumentummal hívható meg
multiply(5)
. Kezdetben aa
paraméter2
ésb
undefined
.
A feltételes utasítás ellenőrzi, hogy ab
undefined
. Ha ez megtörténik, ab = 2
hozzárendelés alapértelmezett értéket állít be.Bár az alapértelmezett értékek hozzárendelésének módja működik, nem ajánlom a közvetlen összehasonlítást a
undefined
-vel. Bőbeszédű és úgy néz ki, mint egy hack.Jobb megközelítés az ES2015 alapértelmezett paramétereinek használata. Rövid, kifejező és nincs közvetlen összehasonlítás a
undefined
vel.Alapértelmezett érték hozzáadása a
b = 2
paraméterhez jobban néz ki:b = 2
a függvény aláírásában megbizonyosodik arról, hogy hab
undefined
, a paraméter alapértelmezés szerint2
.Az ES2015 alapértelmezett paraméterei intuitívak és kifejezőek. Mindig használja az opcionális paraméterek alapértelmezett értékeinek beállításához.
2.4 Funkció visszatérési értéke
implicit módon,
return
utasítás nélkül, JavaScript-függvényundefined
.Olyan függvény, amely nem rendelkezik
return
utasítás implicit módon visszaadja a következőt:undefined
:függvény nem ad vissza számítási eredményt. A függvényhívás eredménye
undefined
.Ugyanez a helyzet akkor fordul elő, amikor a
return
utasítás jelen van, de a közelben nincs kifejezés:return;
utasítás végrehajtásra kerül, de nem ad vissza kifejezést. A meghívás eredménye szinténundefined
.Természetesen a (z)
return
közelében a visszatérendő kifejezés a várt módon működik:Most a függvényhívást
4
-re értékelik, ami2
négyzet.7. tipp: Ne bízzon az pontos pontosvessző beillesztésében.
A JavaScript utasításainak következő listájának pontosvesszővel kell végződnie (
;
) :- üres utasítás
-
let
,const
,var
,import
,export
deklarációk - kifejezés utasítás
-
debugger
utasítás -
continue
utasítás,break
utasítás -
throw
utasítás -
return
utasítás
Ha használja a fenti állítások egyikét, feltétlenül jelöljön pontosvesszőt a végén:
Mindkettő végén
let
deklaráció ésreturn
utasítás kötelező kötelező pontosvesszőt ír.Mi történik, ha nem akarja ezeket megjelölni pontosvesszők? Ilyen helyzetben az ECMAScript egy automatikus pontosvessző-beillesztési (ASI) mechanizmust biztosít, amely beilleszti a hiányzó pontosvesszőket.
Az ASI segítségével eltávolíthatja a pontosvesszőket az előző példából:
A fenti szöveg egy érvényes JavaScript-kód. A hiányzó pontosvesszőket automatikusan beszúrja az Ön számára.
Első látásra elég ígéretesnek tűnik. Az ASI mechanizmus lehetővé teszi a felesleges pontosvesszők kihagyását. Kisebbé és könnyebben olvashatóvá teheti a JavaScript kódot.
Van egy kicsi, de bosszantó csapda, amelyet az ASI hozott létre. Amikor egy új sor
return
és a visszaadottreturn \n expression
kifejezés között áll, az ASI automatikusan pontosvesszőt szúr az új sor eléreturn; \n expression
.Mit jelent a függvény belsejében
return;
utasítás? A függvény visszaadja azundefined
értéket. Ha nem ismeri részletesen az ASI mechanizmusát, akkor a váratlanul visszaadottundefined
félrevezető.Vizsgáljuk meg például a
getPrimeNumbers()
meghívás visszaadott értékét:A
return
utasítás és a tömb szó szerinti kifejezés között új sor létezik. A JavaScript automatikusan pontosvesszőt szúr be areturn
után, a kódot a következőképpen értelmezi:A
return;
utasítás arra készteti agetPrimeNumbers()
függvényt, hogy a várt tömb helyettundefined
visszatérjen.A problémát úgy oldják meg, hogy eltávolítják az új sort a
return
és a tömb literál között:Javaslom, hogy tanulmányozzam, hogyan működik pontosan az automatikus pontosvessző-beillesztés az ilyen helyzetek elkerülése érdekében.
Természetesen soha ne tegyen új sort a
return
és a visszaadott kifejezés közé.2.5 void operátor
void <expression>
kiértékeli a kifejezést, és eredményt ad eredményül:undefined
értékelése.A
void
operátor egyik használati esete a kifejezés kiértékelésének elnyomásaundefined
, az értékelés valamilyen mellékhatására támaszkodva.3. undefined a tömbökben
undefined
jelet kap, ha tömbön kívüli indexű tömb elemhez fér hozzá.colors
tömb 3 elemből áll, így az érvényes indexek ,1
és2
.Mivel a
5
és a-1
indexekben nincs tömb elem, a hozzáférőkcolors
éscolors
undefined
.A JavaScript-ben úgynevezett ritka tömbökkel találkozhat. A tézisek tömbök, amelyekben hiányosságok vannak, vagyis egyes indexeknél nincsenek meghatározva elemek.
Ha egy gyér tömb belsejében egy rés (más néven üres rés) érhető el, akkor kap egy
undefined
.A következő példa ritka tömböket generál, és megpróbálja elérni az üres helyeiket:
sparse1
egy konstruktor első numerikus argumentummal.3 üres helye van.sparse2
egy tömb literállal jön létre, a hiányzó második elemmel.Ezen ritka tömbök bármelyikében az üres nyílás elérése
undefined
értéket jelent.Ha tömbökkel dolgozik, a
undefined
elkerülése érdekében mindenképpen érvényes tömbindexeket használjon, és akadályozza meg a ritka tömbök létrehozását.4. Különbség a undefined és a null között
Mi a fő különbség
undefined
ésnull
? Mindkét speciális érték üres állapotot jelent.undefined
egy még nem inicializált változó értékét képviseli, míg anull
egy objektum szándékos hiányát jelenti.Fedezzük fel a különbséget néhány példában.
A
number
változó definiálva van azonban nincs hozzárendelve kezdeti értékhez:number
változó aundefined
, ami egy inicializálatlan változót jelöl.Ugyanez az inicializálatlan koncepció akkor is előfordul, amikor egy nem létező objektumtulajdont érnek el:
Mert
lastName
tulajdonság nem létezik aobj
fájlban, a JavaScriptobj.lastName
értéket .A másik oldalon tudod, hogy egy változó objektumra számít. De valamilyen oknál fogva nem tudja példányosítani az objektumot. Ebben az esetben a
null
a hiányzó objektum értelmes mutatója.Például a
clone()
olyan függvény, amely klónoz egy sima JavaScript objektumot. A függvény várhatóan visszaad egy objektumot:Azonban
clone()
meghívható egy nem objektum argumentummal:15
vagynull
. Ilyen esetben a függvény nem hozhat létre klónt, így visszaadja anull
-t – egy hiányzó objektum jelzőjét.typeof
operátor különbséget teszundefined
ésnull
között:A szigorú minőségi operátor
===
is helyesen különbözteti meg aundefined
fromnull
:5. Következtetés
undefined
a JavaScript megengedő következménye, amely lehetővé teszi a következők használatát:- inicializálatlan változók
- nem létező objektumtulajdonságok vagy metódusok
- a tömbön kívüli indexek a tömb elemek eléréséhez
- a semmit nem eredményező függvény invokációs eredménye
A (z)
undefined
közvetlen összehasonlítása nem biztonságos, mert a fent említett engedélyezett, de nem ajánlott gyakorlatra támaszkodik.Hatékony stratégia a
undefined
kulcsszó megjelenésének minimális csökkentése a kódban az alábbi jó szokások alkalmazásával:- csökkentse az inicializálatlan változók használatát
- a változók életciklusát rövidre és a használatuk forrásához közel állítsa
- amikor csak lehetséges, kezdőértékeket rendeljen a változókhoz
- favor
const
, különben használja alet
- alapértelmezett értékeket használja a jelentéktelen funkcióparaméterekhez
- ellenőrizze a tulajdonságokat létezik, vagy töltse ki a nem biztonságos objektumokat alapértelmezett tulajdonságokkal
- kerülje a ritka tömbök használatát
Jó, hogy a JavaScript mindkét
undefined
ésnull
hogy üres értékeket jelenítsen meg? -
- A változók nincsenek kitéve inicializálatlan állapotnak, így nincs kockázata a