typescript - Sunt echivalente aceste două declarații if?
Încerc să reduc complexitatea cognitivă a funcției cerută de SonarQube, mă întreb dacă aceste două instrucțiuni if sunt echivalente?
Prima afirmație:
if (
currentRef &&
currentRef.current &&
currentRef.current.value.length === 0
)
Vreau să îl înlocuiesc cu :
if (
currentRef?.current?.value.length === 0
)
Răspuns #1
Da.
Lanțul opțional returnează undefined în cazul unei referințe invalide. Documentația MDN afirmă:
Operatorul ?. este ca operatorul de concatenare ., cu excepția faptului că, în loc să producă o eroare dacă o referință este nulă sau nedefinită (null sau undefined), expresia se oprește și returnează valoarea undefined. Când este folosit cu apeluri de funcții, returnează undefined dacă funcția dată nu există.
Totuși, țineți cont de acest lucru:
Lanțarea opțională nu poate fi utilizată pe un obiect rădăcină nedeclarat, dar poate fi utilizată cu un obiect rădăcină nedefinit.
Exemplu
const dog = {'foo': 0};
console.log(dog?.foo === 0);
console.log(dog?.bar === 0);Răspunsul #2
Cele două afirmații din întrebarea ta sunt echivalente, ceea ce înseamnă că pentru o valoare dată, ambele vor returna fie true, fie false.
Vezi această demonstrație pe terenul de joacă
Este important de menționat că
if (currentRef?.current?.value.length === 0)
este sintaxa preferată pentru aceste declarații, deoarece acestea vă permit, de asemenea, să folosiți o valoare implicită folosind ascunderea nulă.
Fără ascundere nulă:
if (currentRef?.current?.value.length === 0)
// computes to false if 'currentRef or 'current' is undfined'
Cu ascundere nulă:
if ((currentRef?.current?.value.length ?? 0) === 0)
// computes to true if 'currentRef or 'current' is undfined'
