Как работает оператор необязательной цепочки JavaScript (?.)?

#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'
}