javascript - JS/ES6: Destrukturalizácia undefined
Používam takúto deštrukturalizáciu:
const { item } = content
console.log(item)
Ale ako by som mal riešiť content === undefined - čo spôsobí chybu?
„Starý“ spôsob by vyzeral takto:
const item = content && content.item
Takže, ak je content nedefinované -> item bude tiež nedefinované.
Môžem urobiť niečo podobné pomocou deštrukturalizácie?
Odpoveď č. 1
Môžete použiť krátke uzatváranie na hodnotenie (short circuit evaluation), aby ste poskytli predvolenú hodnotu, ak je content nepravdivá hodnota, zvyčajne undefined alebo null v tomto prípade.
const content = undefined
const { item } = content || {}
console.log(item) // undefinedMenej idiomatický spôsob (pozri tento komentár) je rozšíriť obsah do objektu pred jeho deštrukturalizáciou, pretože hodnoty null a undefined sa ignorujú.
const content = undefined
const { item } = { ...content }
console.log(item) // undefinedAk rozkladáte parametre funkcie, môžete priradiť predvolenú hodnotu (= {} v príklade).
Poznámka: Predvolená hodnota sa použije iba v prípade, ak je deštrukturovaný parameter undefined, čo znamená, že deštrukturovanie null hodnôt spôsobí chybu.
const getItem = ({ item } = {}) => item
console.log(getItem({ item: "thing" })) // "thing"
console.log(getItem()) // undefined
try {
getItem(null)
} catch(e) {
console.log(e.message) // Error - Cannot destructure property `item` of 'undefined' or 'null'.
}Alebo nastaviť predvolenú hodnotu pre vlastnosť item, ak vstupný objekt túto vlastnosť neobsahuje
const getItem = ({ item = "default" } = {}) => item
console.log(getItem({ item: "thing" })) // "thing"
console.log(getItem({ foo: "bar" })) // "default"Odpoveď č. 2
const { item } = Object(content)
Odpoveď č. 3
Destrukturalizácia vnoreného objektu je čistá a krátka, ale je problematická, keď je zdrojová vlastnosť null alebo undefined v pravom objekte
povedzme, že máme
const {
loading,
data: { getPosts },
} = useQuery(FETCH_POSTS_QUERY);
Riešenie 1 ak máme dáta objekt, ale nemáme getPosts, môžeme použiť:
(Nastavenie predvolenej hodnoty na každej úrovni)
const {
loading,
data: { getPosts = [] } = { getPosts: [] },
} = useQuery(FETCH_POSTS_QUERY);
Riešenie 2: ak je udalosť data undefined, potom:
const {
loading,
data: { getPosts } = { getPosts: [] },
} = useQuery(FETCH_POSTS_QUERY);
Odpoveď č. 4
Nedávno bol pridaný: Operátor zlučovania s nulou (??).
Ktorý v podstate vracia hodnotu z pravej strany, ak je hodnota z ľavej strany null alebo undefined (v našom prípade undefined namiesto objektu).
const { item } = undefined or null
// Uncaught TypeError: Cannot destructure property 'item' of 'null' as it is null.
const { item } = content ?? {}
console.log(item) // undefined
Tak zvážte použitie operátora. Rovnako, ako bolo spomenuté v predchádzajúcich odpovediach, existuje || (alebo) operátor. Pre nás v tomto konkrétnom prípade nie je významný rozdiel.
To je len otázka vkusu, v našom tíme máme dohodu: používame ?? na definovanie predvoleného objektu, ak je cieľový objekt null alebo undefined, a v iných prípadoch používame operátor ||.
