Невозможно правильно написать троичный оператор в 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
,