Опциональное сцепление ?.
и нулевое слияние??
Теперь вы можете напрямую использовать ?.
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
Чтобы обеспечить значение по умолчанию, вы можете использовать ??
. Если вам требуется первое истинное значение, вы можете использовать ||
.
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 )