Я не уверен, что понимаю логику js-реализации необязательной цепочки.
const a = {b:1}
1 > console.log(a?.c) => undefined
2 > console.log(a?.c?.d) => undefined
3 > console.log(a?.c.d) => Uncaught TypeError: Cannot read property 'd' of undefined
все имеет смысл до тех пор. Потом:
4 > console.log(a?.c?.d.e) => undefined
5 > console.log(a?.c?.d.e.f.g) => undefined
Доступ к свойству undefined вызывает ошибку (№3), но доступ к произвольному количеству несуществующих вложенных свойств после 2 необязательных цепочек больше не вызывает ошибок.
?
после последнего отсутствующего свойства, остальная часть выражения работает, потому что она замыкается. - person Pointy   schedule 07.04.2020a
не равно нулю, ноa.c
равноundefined
- person Pointy   schedule 07.04.2020a
не является ложью. Таким образом, вы получаетеc
от него, но у вас нет необязательной цепочки, поэтому вы выполняете обязательную цепочку (я предполагаю, что это противоположно необязательному), чтобы получить конкретное значениеundefined
и попробуй получить от него свойствоd
. - person VLAZ   schedule 07.04.2020a = { b: { c: { d: "value" }}}
илиa = {}
. Вы говоритеa?.b.c.d
. Если это первый случай, он переходит в значение, если это второй, он просто заметит, что доступ к свойству.b
не существует (undefined
), поэтому он игнорирует все впоследствии и возвращаетundefined
. Однако, если у вас естьa = { b: {}}
, то доступ к свойству дляb
не является неопределенным, и он оценит остальные, что выбрасывает. - person ASDFGerte   schedule 07.04.2020a?.b
- этоa || a.b
в старом синтаксисе, поэтомуa?.b.c
равноa || a.b.c
- еслиa.b
равноundefined
, нет ничего, что могло бы остановить цепочку. В то время какa?.b?.c
будетa || a.b || a.b.c
, поэтому вы не должны пытаться получить.c
изundefined
. - person VLAZ   schedule 07.04.2020