Concatenamento opzionale ?.
e coalescente nullo??
Ora puoi utilizzare direttamente ?.
inline per testare in sicurezza l'esistenza. Tutti i browser moderni lo supportano.
??
può essere utilizzato per impostare un valore predefinito se non definito o nullo.
aThing = possiblyNull ?? aThing
aThing = a?.b?.c ?? possiblyNullFallback ?? aThing
Se esiste una proprietà, ?.
passa al controllo successivo o restituisce il valore valido. Qualsiasi guasto si interromperà immediatamente e ritornerà undefined
.
const example = {a: ["first", {b:3}, false]}
example?.a // ["first", {b:3}, false]
example?.b // undefined
example?.a?.[0] // "first"
example?.a?.[1]?.a // undefined
example?.a?.[1]?.b // 3
domElement?.parentElement?.children?.[3]?.nextElementSibling
null?.() // undefined
validFunction?.() // result
(() => {return 1})?.() // 1
Per garantire un valore predefinito definito, è possibile utilizzare ??
. Se si richiede il primo valore di verità, è possibile utilizzare ||
.
example?.c ?? "c" // "c"
example?.c || "c" // "c"
example?.a?.[2] ?? 2 // false
example?.a?.[2] || 2 // 2
Se non si verifica un caso, la proprietà sul lato sinistro deve esistere. In caso contrario, genererà un'eccezione.
example?.First // undefined
example?.First.Second // Uncaught TypeError: Cannot read property 'Second' of undefined
?.
Supporto browser - 78%, luglio 2020
??
Supporto browser - 78%
Documentazione Mozilla
-
Assegnazione nullo logica, soluzione 2020+
I nuovi operatori sono attualmente in fase aggiunti ai browser, ??=
, ||=
e &&=
. Non fanno esattamente quello che stai cercando, ma potrebbero portare allo stesso risultato a seconda dell'obiettivo del tuo codice.
NOTA: Queste non sono comuni nelle versioni pubbliche del browser ancora , ma Babel dovrebbero transpile bene. Si aggiornerà come cambia la disponibilità.
??=
controlla se il lato sinistro è indefinito o nullo, corto circuito se già definito. In caso contrario, al lato sinistro viene assegnato il valore del lato destro. ||=
e &&=
sono simili, ma basati sugli operatori ||
e &&
.
Esempi di base
let a // undefined
let b = null
let c = false
a ??= true // true
b ??= true // true
c ??= true // false
Esempi di oggetti / array
let x = ["foo"]
let y = { foo: "fizz" }
x[0] ??= "bar" // "foo"
x[1] ??= "bar" // "bar"
y.foo ??= "buzz" // "fizz"
y.bar ??= "buzz" // "buzz"
x // Array [ "foo", "bar" ]
y // Object { foo: "fizz", bar: "buzz" }
Supporto browser luglio 2020 - .03%
Documentazione Mozilla
if( obj?.nested?.property?.value )
invece diif( obj && obj.nested && obj.nested.property && obj.nested.property.value )