2013-12-20 8 views
9

Von einer Sprache Design-Perspektive, warum tutWarum, wenn ('k' in 42); Ausnahme auslösen while for ('k' in 42); nicht, in Javascript?

if ('k' in 42); 

eine TypeError Ausnahme werfen, während

for ('k' in 42); 

nicht?

Ich habe die folgenden Abschnitte in ECMAScript-Spezifikation lesen:

Kann in die eine solche Widersprüchlichkeit der Begründung jemand erklären?

Warum kann Ausdruck 'k' in 42 in if (...) nicht einfach auf false ausgewertet werden?

+0

BTW, es ist das gleiche in ES3. – raina77ow

+1

Meintest du 'for (k in 42)'? Das String-Literal "k" ist an dieser Position nicht einmal syntaktisch gültig. – Bergi

Antwort

2

Den Abschnitt im Abschnitt erneut lesen.

If Type(rval) is not Object, throw a TypeError exception. 

42 ist kein Objekt, es ist eine Zahl

typeof 42 // 'number' 
typeof new Number(42) // 'object' 

for-in-Anweisung nicht ein Objekt erfordert, in der Tat ist es wandelt es tatsächlich zu einem Objekt

Let obj be ToObject(experValue). 

Ich glaube nicht, dass es ein Grund für dieses Verhalten ist, es ist wahrscheinlich ein Designfehler (Inkonsistenz)

+1

'Können einige die Berücksichtigung dieser Entwürfe erklären? 'Das war die Frage: Warum die Inkonsistenz? – raina77ow

+1

@raina77ow "_Ich glaube nicht, dass es ein Grund für dieses Verhalten ist, es ist wahrscheinlich ein Konstruktionsfehler (Inkonsistenz) _" – Broxzier

+2

Eigentlich sehe ich keine Inkonsistenz - die beiden Ausdrücke haben einen ganz anderen Zweck und daher völlig anderes Verhalten. Der einzige Fehler könnte sein, dass für beide das gleiche Schlüsselwort "in" verwendet wurde. – Bergi

1

Ich glaube, die k Hier ist der Unterschied zwischen 'Operator' (in) und 'Anweisung' (for-in). Wenn Sie den Standard überprüfen, werden Sie sehen, dass die letzteren nur Fehler werfen, wenn sie falsch geschrieben werden. Der with Fall, der eine SyntaxError (!) Im strikten Modus wirft, ist ziemlich aussagekräftig.

Anscheinend können Sie nicht erraten, ob for (var x in someExpr) falsch geschrieben wird, es sei denn Sie zuerst someExpr auswerten.

+1

Was meinst du mit 'mit'? – Bergi