Есть что-то вроде быстрой опциональной цепочки в javascript?

Мне очень нравится код в javascript

if (params && params.profile && params.profile.address && params.profile.address.default)

где я должен проверять каждый вариант, он становится довольно утомительным. Есть ли лучший способ в javascript, похожий на то, как swift будет иметь дело с опциями, например.

if let checked = params?.profile?.address?.default?

Ответ 2

Я написал функцию, которая обрабатывает это, в качестве альтернативы ответу YangMinYuan:

function getSafe (func) {
    try {
        return func()
    } catch (e) {
        if (e instanceof TypeError) {
            return undefined
        } else {
            throw e
        }
    }
}

Назовите это так:

if (getSafe(() => params.profile.address.default))

Это работает, потому что, оборачивая его в анонимную функцию, он не обрабатывается до блока try/catch, который затем перехватит ошибку и вернет undefined, если какое-либо из родительских свойств не определено.

Проверка того, является ли e TypeError, предотвращает его проглатывание любых других ошибок, которые может выдать функция, чтобы они по-прежнему могли обрабатываться по мере необходимости. Если вы хотите, чтобы он просто возвращал undefined при любой ошибке, вы можете удалить эту часть:

function getSafeNoErrors (func) {
    try {
        return func()
    } catch {
        return undefined
    }
}

Ответ 3

function optionalChaining(obj, chain) {
  return chain
    .split('.')
    .reduce(function(acc, val) {
        return acc ? acc[val] : undefined;
    }, obj);
}

var user = {
 address: {
  street: 'No.969 West WenYi Road',
},
 a: { b: { c: 2 } },
}

optionalChaining(user, 'address.street'); // 'No.969 West WenYi Road'
optionalChaining(user, 'a.b.c') // 2

Функция может имитировать необязательную цепочку.

Ответ 4

Просто добавьте к ответу выше, теперь вы можете установить этот плагин babel прямо из NPM:

https://www.npmjs.com/package/babel-plugin-transform-optional-chaining

obj?.prop       // optional static property access
obj?.[expr]     // optional dynamic property access
func?.(...args) // optional function or method call

Примечание:

Чтобы позволить foo?.3: 0 быть проанализированным как foo?.3: 0 (как требуется для обратной совместимости), на уровне лексической грамматики добавлена простая "заглядывание", так что последовательность символов?. в этой ситуации не интерпретируется как один токен (за символом?. не должно быть сразу после десятичной цифры).

https://github.com/tc39/proposal-optional-chaining

Также стоит проверить:

https://github.com/tc39/proposal-nullish-coalescing

https://github.com/babel/babel/tree/master/packages/babel-plugin-proposal-nullish-coalescing-operator