Почему необязательный синтаксис цепочки javaScript не работает с методами, не имеющими возвращаемого значения?

Я пробую новый синтаксис JavaScript Optional Chaining, и мне кажется, что у него есть проблема с методами, которые не имеют возвращаемого значения. Например:

У меня есть объект ресторана с методом заказа в нем:

      const restaurant = {
order(i, k) {
    console.log(`I was here with ${i} and ${k}`);
   // does not return value
  }
};

Теперь, если я попытаюсь проверить, существует ли метод заказа внутри объекта ресторана, как показано ниже, он возвращает undefiend:

      const orderCheck = restaurant.order?.(0, 1);
console.log(orderCheck ); // it returns undefined

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

      console.log(restaurant.order?.(0, 1) ?? 'Method does not exist');

Output: 
I was here with 0 and 1
Method does not exist

ПРОБЛЕМА: проблема в приведенном выше утверждении заключается в том, что необязательный синтаксис цепочки даже находит метод заказа и печатает «Я был здесь с 0 и 1», но по-прежнему возвращает undefiend, который заставляет Nullish Coalescing Operator продолжить, и даже он печатает «Метод делает не существует 'тоже как значение по умолчанию?

Теперь, если я разрешаю методу заказа возвращать значение, он отлично работает с оператором Nullish Coalescing и не работает.

       const restaurant = {
    order(i, k) {
        console.log(`I was here with ${i} and ${k}`);
        return '1';
      }
    };

Если проверьте еще раз:

      console.log(restaurant.order?.(0, 1) ?? 'Method does not exist');

Output: 
I was here with 0 and 1

Обязательно ли для необязательного синтаксиса цепочки ожидать от метода возвращаемого значения, отличного от нулевых значений, чтобы проверить его доступность?

В приведенном выше случае метод заказа действительно существует, тогда как предотвратить отказ оператора Nullish Coalescing от действия по умолчанию «Метод не существует»?

Я тестирую его в современных браузерах (Chrome и firfox), и я также включил экспериментальные функции javaScript в Chrome, но он по-прежнему работает так же, как описано выше.

Какие-нибудь мысли были бы полезны? Спасибо

2 ответа

Это не связано с необязательной цепочкой.

В Nullish Operator возвращает свой правый операнд, когда его левый операнд равен нулю или неопределенному, а в противном случае возвращает свой левый операнд.

Следовательно, необязательная цепочка уже работает, поскольку функция существует, но ее возвращаемое значение есть, поэтому оператор переходит в правую часть.

Примечание:

  • журнал внутри функции показывает, что он выполняется первым, но значение не возвращается.
  • если функция не существует, в этом случае она также будет вычислять undefined из-за optional chaining так что правая сторона nullish operator будет также принято

С участием restaurant.order?.(0, 1)вы проверяете, существует ли метод, и если да, то вызываете его и возвращаете результат вызова. В твоем случае, order(0, 1) возвращает undefined, поэтому restaurant.order?(0, 1) также возвращает undefined.

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