Ошибка не возникает при отсутствии this.name в JavaScript с помощью функции includes

#javascript #error-handling

Вопрос:

 class Speaker {
    constructor(name) {
        this.name = name;
    }
    get Message() {
        if (!this.message.includes(this.name)) {
            throw Error("message is missing speaker's name");
        }
        return this.message;
    }
    set Message(val) {
        let tmpMessage = val;
        if (!val.includes(this.name)) {
            tmpMessage = this.name   " "   val;
        }
        this.message = tmpMessage;
    }
}
const speaker = new Speaker();
speaker.Message = "hello";
console.log(speaker.Message); 

Я взял этот код из книги. Я в замешательстве относительно того, почему ошибка не возникает при ее запуске, поскольку в книге говорится, что это так. Вместо этого я получаю неопределенное Привет, Может кто-нибудь пролить свет на это?

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

1. Почему он должен выдавать ошибку? Пройдитесь по коду (или/и добавьте некоторые console.log() буквы, например console.log(val.includes(this.name)) ), и вы поймете, почему он работает так, как работает.

2. нет, я вижу, что это работает, но ошибка не возникает, когда я создаю новый динамик без имени. У меня есть ошибка, которая будет выдана, если я сделаю это в getter this.name == undefined книге, я думаю, что это ошибка в книге?

Ответ №1:

Это не ошибка, потому !this.message.includes(this.name) что она не удовлетворена.

В вашем примере,

 speaker.Message = "hello";
 

Когда вы позвонили по этому телефону, вы внутренне проверяете !val.includes(this.name) . Вот this.name undefined так, !val.includes(this.name) будет true и сообщение, которое будет сохранено undefined hello .

И по звонку

 console.log(speaker.Message);
 

Вы проверяете !this.message.includes(this.name) , вот this.name так undefined и this.message есть undefined hello .

В конце !this.message.includes(this.name) концов так и будет false . Следовательно this.message , возвращается, undefined hello и именно поэтому ошибка не возникает.

 //!this.message.includes(this.name) --> 
//this condition gets evaluated like below, hence error is not thrown
console.log(!"undefined hello".includes(undefined)); 

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

1. В этом есть прекрасный смысл. Так что, возможно, я неправильно истолковываю книгу или пример в книге неправильный. В примере с книгами они указывают имя, только я удалил имя, чтобы попытаться увидеть, не возникает ли ошибка, которой в данном случае не было, и вы объяснили почему.

2. Рад, что помог вам 🙂