2016-06-07 9 views
0

Ich habe eine nicht definierte Variable und überprüfe ich es in einem String Concat:kann nicht richtig ternären Operator in JavaScript schreibt

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

Bedenkt man, dass undefinedVariable nicht definiert ist, undefinedVariable.toString() ist ein unerreichbarer Code. Allerdings habe ich diesen Fehler:

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

Das Merkwürdige ist, wenn ich „foo“ zu Beginn der console.log entfernen, dann wird der Code funktioniert gut.

Ich habe in Chrom und Firefox getestet und ich bekomme das gleiche Ergebnis, also ist es wahrscheinlich kein Fehler. Gibt es eine Erklärung, warum JS-Engines versuchen, den nicht erreichbaren Teil auszuführen?

+0

^Der Titel ist schlecht für diese Frage formuliert, aber wenn Sie die akzeptierte Antwort lesen, es wird dieses Verhalten erklären. –

+0

@MikeC Nopes ... Nicht ein Betrüger von diesem/Falschen Ziel dupieren. ':)' –

+0

@PraveenKumar Wie ich schon sagte, es ist keine exakte Täuschung, aber der Fehler ist der gleiche. Ternäre Bedingungen werden * nach * Verkettung ausgewertet, was bedeutet, dass 'undefinedVariable.toString() 'unabhängig von' undefinedVariable == undefined 'ausgeführt wird. –

Antwort

3

Es ist wegen der Operator Precedence. Der + (Verkettungsoperator) hat eine höhere Priorität als der ?: (ternärer Operator). Also, Sie müssen die ternäre Bedingung in () einfügen, weil es dauert es zusammen mit der + (Verkettung Operator) und nicht mehr die linke Seite ist undefined. Verwendung:

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

Sie müssen die JavaScript-Engine sagen, die undefinedVariable separat zu bewerten und nicht beitreten sowohl die "foo" und undefinedVariable und bewerten.

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

Die oben gibt mir: foobar.

Output

+2

Zu beachten - dies liegt an der Vorrangstellung des Betreibers - https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Operators/Operator_Precedence – SergeS

+0

@SergeS Danke, aber wie kommt das hier ins Spiel? Wird '?' Oder '===' als Operator betrachtet oder was? –

+1

@PraveenKumar Wenn Sie diese Ressource lesen, sehen Sie, dass '+' eine höhere Priorität hat als '?:', Was in diesem Fall bedeutet, dass die Verkettung stattfindet, bevor die ternäre Bedingung ausgewertet wird. –

Verwandte Themen