javascript - Hur kontrollerar man en odefinierad variabel i en ternär operator?


Jag har ett problem med ternära operationen:

let a = undefined ? "Defined!" : "Definitely Undefined",
    b = abc ? "Defined!" : "Definitely Undefined", // ReferenceError
    c = (abc !== undefined) ? "Defined!" : "Definitely Undefined", // ReferenceError
    d = (typeof abc !== "undefined") ? "Defined!" : "Definitely Undefined"

// results: a = d = "Definitely Undefined", 
// while b and c throw ReferenceError when abc is undefined

Vad är det bästa och kortaste sättet att kontrollera om abc är undefined innan man får åtkomst till dess egenskaper samt tilldela ett tomt objekt {} om det är undefined?

let a = [[best way to check abc]] ? {[abc.label1]: 2, [abc.label2]: 1} : {}

PS: Jag använder för närvarande (typeof abc !== "undefined") istället för [[bästa sättet att kontrollera abc]]

Svar #1

medan b och c ger ReferenceError när abc är odefinierad

Så abc är inte bara odefinierad, den är oannonserad. Det är stor skillnad där.

Om du behöver hantera att abc inte är deklarerat, är det enda säkra sättet att göra det (utan try/catch) med typeof:

typeof abc === "undefined"

Det kommer att vara sant, utan fel, om abc är en odeklarerad identifierare. Det kommer också att vara sant om abc är deklarerad och innehåller värdet undefined.

Vad är det bästa och kortaste sättet att kontrollera om abc är odefinierad innan man får åtkomst till dess egenskaper samt tilldela ett tomt objekt {} om det är odefinierat?

Antagligen använder var för att säkerställa att det är deklarerat:

var abc = abc || {};

Dubblettdeklarationer av var är inte fel (dubblettdeklarationer av let är det). Så med ovanstående, om abc inte är deklarerat, deklareras det med det initiala värdet undefined och vi tilldelar det {}. Om det är deklarerat, ersätter vi dess värde med {} om det är falskt. Men, om det kan vara deklarerat med let eller const, kommer ovanstående också att ge ett fel.

Så för att hantera fallet där det kanske eller kanske inte deklareras med let eller const, behöver vi en helt annan variabel:

let ourabc = typeof abc === "undefined" || !abc ? {} : abc;

Det sätter ourabc till {} om abc är odeklarerad eller om det innehåller ett falskt värde. Eftersom alla icke-null objektreferenser är sanna, och du har sagt att du vill komma åt objektets egenskaper, är det förmodligen det kortaste sättet.

Svar #2

   state = (typeof state !== "undefined") ? state : '';

På detta sätt kan du kontrollera en odefinierad variabel i en ternär operator.

Relaterade artiklar