Encadeamento opcional ?.
e coalescência nula??
Agora você pode usar diretamente ?.
inline para testar com segurança a existência. Todos os navegadores modernos são compatíveis.
??
pode ser usado para definir um valor padrão se indefinido ou nulo.
aThing = possiblyNull ?? aThing
aThing = a?.b?.c ?? possiblyNullFallback ?? aThing
Se existir uma propriedade, ?.
prossiga para a próxima verificação ou retorne o valor válido. Qualquer falha irá imediatamente causar um curto-circuito e retornar 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 garantir um valor definido padrão, você pode usar ??
. Se você precisar do primeiro valor de verdade, poderá usar ||
.
example?.c ?? "c" // "c"
example?.c || "c" // "c"
example?.a?.[2] ?? 2 // false
example?.a?.[2] || 2 // 2
Se você não verificar um caso, a propriedade do lado esquerdo deverá existir. Caso contrário, lançará uma exceção.
example?.First // undefined
example?.First.Second // Uncaught TypeError: Cannot read property 'Second' of undefined
?.
Suporte do navegador - 78%, julho de 2020
??
Suporte ao navegador - 78%
Documentação Mozilla
-
Designação nula lógica, solução 2020+
Novos operadores estão sendo adicionados aos navegadores, ??=
, ||=
e &&=
. Eles não fazem exatamente o que você está procurando, mas podem levar ao mesmo resultado, dependendo do objetivo do seu código.
NOTA: Estas não são comuns nas versões públicas do navegador ainda , mas Babel deve transpile bem. Será atualizado conforme a disponibilidade for alterada.
??=
verifica se o lado esquerdo está indefinido ou nulo, em curto-circuito, se já definido. Caso contrário, o lado esquerdo recebe o valor do lado direito. ||=
e &&=
são semelhantes, mas com base no ||
e &&
operadores.
Exemplos básicos
let a // undefined
let b = null
let c = false
a ??= true // true
b ??= true // true
c ??= true // false
Exemplos 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" }
Suporte para navegadores julho de 2020 - 0,03%
Documentação Mozilla
if( obj?.nested?.property?.value )
vez deif( obj && obj.nested && obj.nested.property && obj.nested.property.value )