Почему не 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 он просто игнорирует все