1. Ponto de interrogação duplo (??)
valor1 ?? valor2
?? Pega um valor entre valor1 e valor2, só pega valor2 quando valor1 é nulo ou indefinido, senão pega valor1 (0, falso, "" é considerado significativo, então pega valor1)
const obj = {}
console.log(obj.c ?? 'd') // 'd'
console.log(1 ?? "xx") // 1
console.log(0 ?? "xx") // 0
console.log(null ?? "xx") // xx
console.log(undefined ?? "xx") //xx
console.log(-1 ?? "xx") // -1
console.log("" ?? "xx") // ''
2. Ponto de interrogação (?.)
Ao acessar propriedades de objetos multicamadas (como res.data.list), se a propriedade res.data estiver vazia, um erro de referência será relatado, então temos que lidar com isso da seguinte forma:
let dataList = res && res.data && res.data.list
Parece muito feio, a nova sintaxe introduzida hoje é para resolver esse problema (operador de cadeia opcional?.)
Com encadeamento opcional, você pode referenciar com segurança uma propriedade nula ou indefinida:
deixe dataList = res?.data?.list
A função é julgar se (comprimento) sob (valor) sob (businessObject) sob este objeto (this.element) é nulo ou indefinido, e retornar indefinido quando um dos links for nulo ou indefinido, para que mesmo que haja um atributo ausente no meio Nenhum erro será relatado e o valor padrão é seguido por um ponto de interrogação duplo.
Exemplo 1 :
var obj ={}
console.log(obj ?. a ?. b) // undefined
console.log(obj ?. a ?. b ?? 88 ) // 88
console.log(obj) // Object {}
console.log(obj.a) // undefined
console.log(obj.a.b) // 报错
Exemplo 2 :
var obj={a:{b:1}}
console.log(obj.a.b) // 1
console.log(obj ?. a ?. b ?? 66) // 1
console.log(obj ?. a ?. c ?? 66) // 66
console.log(obj) // {a:{b:1}}
console.log(obj.a) // {b:1}