Необов'язковий ?.
ланцюжок і нульове злиття??
Тепер ви можете безпосередньо використовувати ?.
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 )