Необов'язковий ?.ланцюжок і нульове злиття??
Тепер ви можете безпосередньо використовувати ?.Inline, щоб безпечно перевірити наявність. Всі сучасні браузери його підтримують.
?? може використовуватися для встановлення значень за замовчуванням, якщо невизначене або недійсне.
aThing = possiblyNull ?? aThing
aThing = a?.b?.c ?? possiblyNullFallback ?? aThing
Якщо властивість існує, ?.переходить до наступної перевірки або повертає дійсне значення. Будь-який збій негайно замикається і повертається 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
Щоб забезпечити визначене за замовчуванням значення, ви можете використовувати ??. Якщо вам потрібно перше значення truthy, ви можете використовувати ||.
example?.c ?? "c" // "c"
example?.c || "c" // "c"
example?.a?.[2] ?? 2 // false
example?.a?.[2] || 2 // 2
Якщо ви не перевіряєте випадок, властивість зліва повинна існувати. Якщо ні, то це викине виняток.
example?.First // undefined
example?.First.Second // Uncaught TypeError: Cannot read property 'Second' of undefined
?.Підтримка браузера - 78%, липень 2020 року
??Підтримка браузера - 78%
Документація Mozilla
-
Логічне нульове призначення, рішення 2020+
Наразі до браузерів додаються нові оператори ??=, ||=та &&=. Вони роблять не зовсім те, що ви шукаєте, але можуть призвести до того ж результату залежно від мети вашого коду.
Примітка: Це не поширене в версіях браузера відкритих ще , але Бабель повинен transpile добре. Оновлюватиметься в міру зміни доступності.
??=перевіряє, чи ліва сторона не визначена чи нульова, коротке замикання якщо вже визначено. Якщо ні, лівій стороні присвоюється значення правого боку. ||=і &&=схожі, але на основі ||і &&операторів.
Основні приклади
let a // undefined
let b = null
let c = false
a ??= true // true
b ??= true // true
c ??= true // false
Приклади об'єктів / масивів
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" }
Підтримка браузера липень 2020 р. - .03%
Документація Mozilla
if( obj?.nested?.property?.value )замістьif( obj && obj.nested && obj.nested.property && obj.nested.property.value )