Невозможно правильно написать троичный оператор в JavaScript

У меня есть неопределенная переменная, и я проверяю ее в строке concat:

var undefinedVariable = undefined;
console.log("foo" + undefinedVariable === undefined ? "bar" : undefinedVariable.toString() );

Учитывая, что undefinedVariable является неопределенной, undefinedVariable.toString() это недоступный код Тем не менее, я получаю эту ошибку:

Uncaught TypeError: Невозможно прочитать свойство 'toString' из неопределенного (…)

Странная вещь, если я уберу "foo" в начале console.log, тогда код работает нормально.

console.log(undefinedVariable === undefined ? "bar" : undefinedVariable.toString() );

Я тестировал в Chrome и Firefox, и я получил тот же результат, так что, вероятно, это не ошибка. Есть ли какое-то объяснение, почему движки JS пытаются запустить недоступную часть?

1 ответ

Решение

Это из-за приоритета оператора. + (оператор конкатенации) имеет больший приоритет, чем ?: (троичный оператор). Итак, вам нужно заключить троичное состояние внутри () потому что это берет его вместе с + (оператор конкатенации) и не более левой стороны undefined, Использование:

console.log("foo" + (undefinedVariable === undefined ? "bar" : undefinedVariable.toString()) );

Вы должны указать движку JavaScript для оценки undefinedVariable отдельно и не присоединяйтесь к "foo" а также undefinedVariable и оценить.

var undefinedVariable = undefined;
console.log("foo" + (undefinedVariable === undefined ? "bar" : undefinedVariable.toString()) );

Вышесказанное дает мне: foobar,

Выход

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