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 (
constvagyletnyilatkozatok). 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éslengthvá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
forutasításban szereplőindex,iteminicializálatlanok ésundefinedvannak 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ésitemváltozók csak aforutasítás blokk hatókörében léteznek. Nincs jelentésük aforkívül.
Alengthvá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:
favoriteMovieegyetlen tulajdonsággal rendelkező objektumtitle. Egy nem létező tulajdonság eléréseactorsegy tulajdonság-hozzáférés használatávalfavoriteMovie.actorsundefined. / 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
undefinedcsapda, amelyet a jól ismertTypeError: Cannot read property <prop> of undefined.Módosítsuk kissé az előző kódrészletet egy
TypeErrordobás szemléltetése érdekében:favoriteMovienem rendelkezik aactorstulajdonsággal, tehátfavoriteMovie.actorsundefinedértéket kap.Ennek eredményeként a
undefinedérték első elemének elérése afavoriteMovie.actorskifejezé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á. AtoAppendparamé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
toAppendobjektum elhagyhatja afirstvagy alasttulajdonsá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-efirstvagylasttulajdonsá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 aundefinedkö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
inoperátort. Rövid és édes szintaxisa van. Azinoperá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 ainoperátor, és csak az objektum saját tulajdonságaiban ellenőrzi.Javítsuk a
append(array, toAppend)függvényt ainoperátor használatával:"first" in toAppend(és"last" in toAppend)truehogy létezik-e a megfelelő tulajdonság,falsekülönben.inoperá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énylesz.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
interner 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
undefinedkö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. Aconfigmásodik argumentum egy tulajdonságú objektum:Az objektum rombolásának előnyeit alkalmazva valósítsuk meg a
quote():const { char = """, skipIfQuoted = true } = configegy soron belüli strukturálás hozzárendeli acharésskipIfQuotedaconfigobjektumból.
Ha néhány tulajdonság hiányzik aconfigobjektumból, a destrukturálási hozzárendelés megadja az alapértelmezett értékeket :"""charésfalseeseté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
{ }) aconfigparaméterhez, hogy a második argumentumot kihagyja, ha az alapértelmezett beállítások elegendőek.A romboló hozzárendelés a
configparamé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
undefinedt é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
unsafeOptionsobjektum tulajdonságaihoz, amelyek nem mindig tartalmazzák a teljes tulajdonságkészletet.A
undefinedelkerülése érdekében, amikor egy nem létező tulajdonsághoz hozzáfér aunsafeOptionscí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 adefaultsfájlok veszik át.
unsafeOptionscsakfontSizetulajdonságot tartalmaz. Adefaultsobjektum meghatározza azfontSizeéscolortulajdonságok alapértelmezett értékeit.Object.assign()az első argumentumot célobjektumként veszi fel{}. A célobjektum megkapja azfontSizetulajdonság értékét azunsafeOptionsforrásobjektumtól. És acolortulajdonság értéke adefaultsforrásobjektumból, mert aunsafeOptionsnem 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
optionsobjektum bármely tulajdonságához, beleértve aoptions.colorfájlt, amely nem volt elérhető aunsafeOptionskezdetben.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ésunsafeOptionsforrá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
undefinednem 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
undefinedvagynull: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
undefinedvagynull:stylesobjektum nem rendelkezik acolortulajdonsággal, tehátstyles.colora tulajdonság-hozzáférésundefined.styles.color ?? "black"az alapértelmezett értéket"black"értékeli.styles.fontSize18, 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ésbparamé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
undefinedlesz.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 aaparaméter5, de a Abparamé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
bparaméterundefined, hagyja alapértelmezés szerint2:A függvény egyetlen argumentummal hívható meg
multiply(5). Kezdetben aaparaméter2ésbundefined.
A feltételes utasítás ellenőrzi, hogy abundefined. Ha ez megtörténik, ab = 2hozzá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
undefinedvel.Alapértelmezett érték hozzáadása a
b = 2paraméterhez jobban néz ki:b = 2a függvény aláírásában megbizonyosodik arról, hogy habundefined, 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,
returnutasítás nélkül, JavaScript-függvényundefined.Olyan függvény, amely nem rendelkezik
returnutasí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
returnutasí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)
returnkö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, ami2né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,exportdeklarációk - kifejezés utasítás
-
debuggerutasítás -
continueutasítás,breakutasítás -
throwutasítás -
returnutasí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
letdeklaráció ésreturnutasí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 expressionkifejezé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 visszaadottundefinedfélrevezető.Vizsgáljuk meg például a
getPrimeNumbers()meghívás visszaadott értékét:A
returnutasí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 areturnutá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 helyettundefinedvisszaté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
voidoperá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
undefinedjelet kap, ha tömbön kívüli indexű tömb elemhez fér hozzá.colorstömb 3 elemből áll, így az érvényes indexek ,1és2.Mivel a
5és a-1indexekben nincs tömb elem, a hozzáférőkcolorséscolorsundefined.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:
sparse1egy konstruktor első numerikus argumentummal.3 üres helye van.sparse2egy 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
undefinedelkerü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.undefinedegy még nem inicializált változó értékét képviseli, míg anullegy objektum szándékos hiányát jelenti.Fedezzük fel a különbséget néhány példában.
A
numberváltozó definiálva van azonban nincs hozzárendelve kezdeti értékhez:numbervá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
lastNametulajdonság nem létezik aobjfá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
nulla 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:15vagynull. Ilyen esetben a függvény nem hozhat létre klónt, így visszaadja anull-t – egy hiányzó objektum jelzőjét.typeofoperátor különbséget teszundefinedésnullközött:A szigorú minőségi operátor
===is helyesen különbözteti meg aundefinedfromnull:5. Következtetés
undefineda 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)
undefinedkö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
undefinedkulcsszó 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ésnullhogy üres értékeket jelenítsen meg? -
- A változók nincsenek kitéve inicializálatlan állapotnak, így nincs kockázata a