Почему необязательный синтаксис цепочки 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.