Почему не undefined? .Fun () выдает ошибку?

Я был очень удивлен, увидев в Node 14.18.0 следующее поведение:

      > {}?.fun();
Uncaught TypeError: b?.fun is not a function
      > undefined?.fun();
undefined

Я понимаю, почему первый оператор вызывает ошибку TypeError. {}?.funесть, который нельзя отозвать. Но undefined?.fun это также undefined, так почему его можно назвать без заброса? Какая часть спецификации ECMAScript определяет это поведение? Приводила ли рабочая группа ECMAScript какие-либо причины, почему это должно работать именно так?

2 ответа

Решение

Во время необязательного связывания, если текущее значение в цепочке равно или, выражение замыкается с возвращаемым значением.

Это в официальных документах :

В ?. оператор похож на . оператор цепочки, за исключением того, что вместо того, чтобы вызывать ошибку, если ссылка nullish ( nullили), выражение замыкается с возвращаемым значением. При использовании с вызовами функций возвращает undefined если данная функция не существует.

С {} является реальным объектом - без метода с именем fun() - он взрывается, потому что вы вызвали функцию, которой не существовало.

Чтобы исправить вашу проблему, вам нужно будет вызвать функцию с необязательной цепочкой:

работа? и скажем, что возможно значение не определено

обычно используется так в машинописном тексте

      console.log(myobj?.value ?? 'does not exist');

в javascript "?" это бесполезно

"?" ничего не делает, он просто сигнализирует, что значение может быть неопределенным, поэтому, когда вы помещаете объект, он возвращает ошибку, потому что это свойство не существует в вашем объекте, тогда как в неопределенном javascript он просто игнорирует все

Другие вопросы по тегам