2013-07-23 7 views
5

Warum haben Programmiersprachen einen NaN Wert?Warum brauchen wir den NaN-Wert, wenn wir TypeErrors werfen können?

Math.floor('string'); //--> NaN 

Warum nicht einfach einen TypeError werfen?

TypeError: Expected number instead of string 

Die Frage sowohl markiert ist und weil JavaScript, um die Sprache, die ich bin in erster Linie vertraut ist, aber ich weiß, dass dies auch auf andere Sprachen gilt.

+0

Weil Ausnahmen ein Schmerz im Hals sind :) – Pointy

+0

@Pointy Fangen sie scheint nicht so schwer zu sein. –

+1

Sie führen eine Art von Nichtlinearität im Code ein. Es ist nicht so sehr, dass es * schwer * ist, es ist nur ablenkend und unordentlich. – Pointy

Antwort

4

In typisierten Sprachen müssen Sie eine Zahl in eine Zahlenvariable eingeben, auch wenn Sie keine Nummer haben. Sie setzen NaN (deshalb typeof NaN ist "number" in JavaScript). Das ist genau wie null für Objektreferenzen, wenn Sie nicht besser haben.

Und Ausnahmen, die den Fluss der Anweisungen brechen, sind wirklich nicht so beliebt für alle. Einige könnten argumentieren, dass sie für außergewöhnliche Fälle verwendet werden sollten, nicht die einfache Tatsache, dass ein String nicht als Zahl geparst werden kann.

Beachten Sie, dass NaN auch das Ergebnis einer mathematischen Operation sein kann, die auftritt, wenn nicht entschieden werden kann, was das Ergebnis sein soll (z. B. 0 * Infinity). Es ist einfacher, dies mit NaN zu handhaben, als Verzweigungen in allen Operationen einzuschließen.

+0

Vielen Dank! Sie machen eine interessante Analogie 'NaN: number :: null: object' –

+1

@Web_Designer Beachten Sie, dass' typeof null' ist '" object "' :) –

3

JavasScript ist eine schwach typisierte Sprache. Fehler werfen ist teuer. Sehen Sie sich jquery oder Unterstriche an und Sie werden sehen, dass Fehler nur selten ausgelöst werden, nur für "außergewöhnliche" Fälle. Es ist weniger kostspielig und einfacher, mit Werten wie NaN umzugehen.

4

Um unkreativ zu sein, ist es, weil NaN s (sowie andere nicht numerische Größen, wie Unendlichkeit) Teil der IEEE 754 floating-point standard sind, die viele Programmiersprachen implementieren.

Es wurde entwickelt, um "Sonderfälle" bei der numerischen Berechnung zu ermöglichen, die wie normale Zahlen ausgewertet werden, ohne die Berechnungen zu unterbrechen. Das bedeutet keine Ausnahmen. Stattdessen werden NaNs im Allgemeinen durch Operationen propagiert, bis sie auf der anderen Seite zum Guten oder zum Schlechten kommen.

+1

ja, obwohl in diesem speziellen Fall ist es ein * wenig * fraglich, 'NaN zurückzugeben '. – Pointy