#javascript #ecmascript-next #optional-chaining
#javascript #ecmascript-next #необязательно-цепочка
Вопрос:
Я изучал новый необязательный ?.
оператор цепочки JS. Это помогает нам избежать подобных ошибок,
TypeError: Cannot read property ‘x’ of undefined
Вы можете написать
const obj = {a: 1};
console.log(obj?.b);
без ошибок. Он вернется undefined
, если в объекте нет имени свойства b
obj
. Теперь это работает для операторов первого уровня (.) . Но если я попробую что-то вроде этого,
console.log(obj.b.c.d?.e);
Это выдает ошибку,
Uncaught TypeError: obj.c is undefined // In firefox it throws obj.b is undefined.
Но если я напишу,
console.log(obj.b?.c.d?.e);
Он снова возвращает undefined . Разве он не должен возвращаться Uncaught TypeError: obj.b.c is undefined
?
Это какой-то пробел в реализации или я что-то здесь упускаю? Заранее спасибо.
Теперь это решено. Комментарий @Ifaruki содержит правильное объяснение.
Обновление: его называют оператором «цепочки». он перемещается слева направо. если он видит ?. он проверяет левое значение, если оно не определено. если да, он возвращает undefined и перестает двигаться вправо. это означает, что если b уже не определено, он не будет проверять значения с правой стороны
Комментарии:
1. его называют оператором «цепочки». он перемещается слева направо. если он видит
?.
, он проверяет левое значение, если оно не определено. если да, он возвращает undefined и перестает двигаться вправо. это означает, что еслиb
уже не определено, оно не будет проверять значения с правой стороны2. «Он вернется
undefined
, если в объекте нет имени свойстваb
obj
» . Это больше похоже на: «Он вернетundefined
, если сам объектobj
являетсяnull
илиundefined
; или если объектobj
существует, но не имеет свойстваb
» .3. »
?.
Оператор функционирует аналогично оператору.
цепочки, за исключением того, что вместо того, чтобы вызывать ошибку, если ссылка являетсяnull
ish (null
илиundefined
), выражение замыкается с возвращаемым значениемundefined
» .4. Спасибо всем. @Ifaruki, ваше объяснение было особенно полезным.
5. Как в вашем первом, так и во втором примере необязательный оператор цепочки не отличается от обычного средства доступа к свойствам.
obj?.b
просто считываетb
(что естьundefined
), посколькуobj
не является нулевым.
Ответ №1:
Его называют оператором «цепочки». Он перемещается слева направо. если он видит ?.
, он проверяет левое значение, если его undefined
. если да, он возвращается undefined
и перестает двигаться вправо. это означает, что if b
уже undefined
не будет проверять значения с правой стороны
Ответ №2:
В приведенном ниже примере obj имеет только один ключ a .
const obj = {a: 1};
console.log(obj?.b);
В приведенном выше фрагменте кода в object нет свойства b, из-за которого он печатает undefined .
console.log(obj.b.c.d?.e);
console.log(obj.b?.c.d?.e);
Даже в приведенном выше коде происходит то же самое, когда у объекта нет ключа b, следовательно, он печатает undefined . Итак, если вы хотите увидеть, что obj.b.c не определен, тогда объект должен выглядеть следующим образом:
obj: {
b: '123'
}