2016-06-07 3 views
0

У меня есть неопределенная переменная, и я проверить его в струнной CONCAT:Невозможно правильно написать тройной оператор в JavaScript

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

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

Uncaught TypeError: Cannot read property 'toString' of undefined(…)

Странная вещь, если удалить «Foo» в начале console.log, то код работает отлично.

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

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

+0

^Заголовок плохо сформулированный для этого вопроса, но если вы читаете принятый ответ, это будет объяснить такое поведение. –

+0

@MikeC Nopes ... Не обман этой цели/неправильной цели. ':)' –

+0

@PraveenKumar Как я уже сказал, это не точный обман, но ошибка такая же. Тернарные условия оцениваются * после * конкатенации, что означает, что 'undefinedVariable.toString()' выполняется независимо от 'undefinedVariable === undefined'. –

ответ

3

Это из-за Operator Precedence. + (оператор конкатенации) имеет больший приоритет, чем ?: (тройной оператор). Таким образом, вам нужно приложить тройное состояние внутри (), потому что оно берет его вместе с + (оператор конкатенации) и не более левой стороной является 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.

Output

+2

Следует отметить, что это связано с приоритетом оператора оператора - https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Operators/Operator_Precedence – SergeS

+0

@SergeS Спасибо, но как это происходит здесь. Будет ли '?' Или '===' рассматриваться как оператор или что? –

+1

@PraveenKumar Если вы прочитали этот ресурс, вы увидите, что '+' имеет более высокий приоритет, чем '?:', Который в этом случае означает, что конкатенация происходит до того, как будет оценено тернарное условие. –

Смежные вопросы