JS: Необходима ли необязательная цепочка, если только последнее поле может быть пустым?

#javascript

Вопрос:

Я получаю ошибку в NewRelic, показывающую ошибку JS для `не удается прочитать таймеРшоу свойства null . Я проследил его до этой функции:

 isShown() {
    return this.person.value.timerShow === this.timerActive;
}
 

Когда я захожу в журнал this.person.value , это объект, но timerShow иногда на нем нет поля. Разве это все равно не сработало бы и просто не привело false бы к тому, что этого не произошло timerShow ?

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

 isShown() {
    return this.person?.value?.timerShow === this.timerActive;
}
 

где value потенциал может быть равен нулю

Комментарии:

1. Как указано в сообщении об ошибке, есть случай, когда значение this.person.value равно null . Вам нужно будет это отладить

2. » Когда я захожу в журнал this.person.value , это объект » — видимо, не всегда. Если это не соответствует вашим ожиданиям, найдите источник проблемы, вместо того чтобы просто устранять ее this.person.value?.timerShow . Да, если только timerShow этого не существует, это просто приводит к тому, что сравнение дает false результат .

3. @Bergi спасибо тебе. Просто для ясности, хотя, если value бы всегда гарантированно был объект, необязательное включение timerShow не было бы необходимым, верно? this.person.value?.timerShow было бы то же this.person.value.timerShow самое , верно?

4. отсутствие доступа к какому-либо методу для чего-либо, что равно нулю, выдает ошибку, но если вы используете ? его, он просто вернет неопределенное значение

5. @HarLinton Да, если value бы всегда был объект, вы могли бы использовать value.… вместо value?.… .

Ответ №1:

попробуйте это:

 isShown() {
    if(typeof this.person?.value?.timerShow == "undefined")
        return false;
    return this.person?.value?.timerShow === this.timerActive;
}
 

Ответ №2:

Попробуй вот так:

 isShown() {
    return this.person?.value?.timerShow ?? 'your return here '
}
 

Если в первой части ничего нет, она возвращает вторую часть ??