Encadenamiento opcional ?.
y fusión nula??
Ahora puede usar directamente en ?.
línea para probar la existencia de forma segura. Todos los navegadores modernos lo admiten.
??
se puede usar para establecer un valor predeterminado si no está definido o es nulo.
aThing = possiblyNull ?? aThing
aThing = a?.b?.c ?? possiblyNullFallback ?? aThing
Si existe una propiedad, ?.
pasa a la siguiente verificación o devuelve el valor válido. Cualquier falla provocará un cortocircuito y regresará de inmediato 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
Para garantizar un valor definido predeterminado, puede usar ??
. Si necesita el primer valor verdadero, puede usarlo ||
.
example?.c ?? "c" // "c"
example?.c || "c" // "c"
example?.a?.[2] ?? 2 // false
example?.a?.[2] || 2 // 2
Si no marca un caso, la propiedad del lado izquierdo debe existir. Si no, arrojará una excepción.
example?.First // undefined
example?.First.Second // Uncaught TypeError: Cannot read property 'Second' of undefined
?.
Soporte de navegador : 78%, julio de 2020
??
Soporte de navegador : 78%
Documentación de Mozilla
-
Asignación nula lógica, solución 2020+
Actualmente se están agregando nuevos operadores a los navegadores ??=
, ||=
y &&=
. No hacen exactamente lo que está buscando, pero podrían conducir al mismo resultado dependiendo del objetivo de su código.
NOTA: Todavía no son comunes en las versiones de navegador público , pero Babel debería compilarse bien. Se actualizará a medida que cambie la disponibilidad.
??=
comprueba si el lado izquierdo es indefinido o nulo, cortocircuito si ya está definido. Si no, al lado izquierdo se le asigna el valor del lado derecho. ||=
y &&=
son similares, pero se basan en los operadores ||
y &&
.
Ejemplos básicos
let a // undefined
let b = null
let c = false
a ??= true // true
b ??= true // true
c ??= true // false
Ejemplos de objeto / matriz
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" }
Soporte de navegador Julio 2020 - .03%
Documentación de Mozilla
if( obj?.nested?.property?.value )
lugar deif( obj && obj.nested && obj.nested.property && obj.nested.property.value )