Peter Lustig: typeof liefert immer string

Hallo - ich bin ein absoluter Neueinsteiger in Java und schon am verzweifeln. Ich hoffe das Ihr weiterhelfen könnt!

Es geht um dieses Script:
<script type="text/javascript">
function ausgabe () {
var eingabe = prompt("Eingabe bitte...", "...hier vornehmen");
document.Formular.wiedergabe.value = eingabe;
document.Formular.type.value = typeof(eingabe)}
</script>

unter typeof erhalte ich immer einen String auch wenn ich Zahlen oder true eingeben - was mache ich falsch.

Vielen Dank im Vorraus

  1. Hello,

    unter typeof erhalte ich immer einen String auch wenn ich Zahlen oder true eingeben - was mache ich falsch.

    du nimmst an, dass typeof bzw. JavaScript eine Analyse des Inhalts vornehmen. Tun sie in dem Fall aber nicht. Der Rückgabewert von prompt ist String - Punkt.
    Wenn du wissen willst ob der Wert numerisch ist, dann frage explizit danach: isNaN.

    MfG
    Rouven

    --
    -------------------
    Vegetarier essen meinem Essen das Essen weg.
  2. Hello out there!

    Hallo - ich bin ein absoluter Neueinsteiger in Java

    Vermutlich nicht.

    Mit Java bist du sicher noch gar nicht in Berührung gekommen. Du bist absoluter Neueinsteiger in JavaScript.

    unter typeof erhalte ich immer einen String auch wenn ich Zahlen oder true eingeben - was mache ich falsch.

    Gar nichts. prompt() liefert einen String.

    Was willst du mit diesem String anstellen Willst du den String in eine Zahl umwandeln?

    See ya up the road,
    Gunnar

    --
    „Und [dieses Forum] soll […] auch ein Fachforum bleiben und kein Psychologieforum werden.“ (Kirsten Evers)
    1. ich will das ich wenn ich eine Zahl eingebe unter typeof Number erhalte
      wenn ich true eingebe soll da boolean stehen usw...

      1. Hallo,

        ich will das ich wenn ich eine Zahl eingebe unter typeof Number erhalte
        wenn ich true eingebe soll da boolean stehen usw...

        So funktioniert es doch eigentlich auch. Allerdings gibt typeof immer einen String zurücck, also "typeof true" liefert z.B. 'boolean'.
        Aber, was schlimmer ist: "typeof null" lügt 'object' und "typeof []" sagt ebenfalls 'object', statt 'array'.

        Man kann aber eine eigene Funktion basteln, die die korrekten Strings zurückgibt ('null' und 'array').

        Gruß, Don P

        1. Moin!

          ich will das ich wenn ich eine Zahl eingebe unter typeof Number erhalte
          wenn ich true eingebe soll da boolean stehen usw...

          So funktioniert es doch eigentlich auch.

          Javascript wandelt einen Variablentyp nicht deshalb, weil man typeof aufruft, sondern nur dann, wenn zueinander inkompatible Typen miteinander verknüpft werden. Erst dann werden z.B. Strings in Zahlen oder Zahlen in Strings gewandelt.

          Allerdings gibt typeof immer einen String zurücck, also "typeof true" liefert z.B. 'boolean'.

          Ich denke, der Ergebnistyp von typeof ist hier nicht das Problem.

          Aber, was schlimmer ist: "typeof null" lügt 'object' und "typeof []" sagt ebenfalls 'object', statt 'array'.

          Nein, da wird nichts gelogen. Ein Array (auch ein leeres) ist ein Objekt, nämlich eine Instanz der Array-Klasse. Und dasselbe gilt für das Null-Objekt.

          Mit instanceof kann man das beweisen:
          alert([] instanceof Array);
          // ergibt true.

          Man kann aber eine eigene Funktion basteln, die die korrekten Strings zurückgibt ('null' und 'array').

          Man kann viel - wenn man das unbedingt benötigt.

          - Sven Rautenberg

          --
          "Love your nation - respect the others."
          1. Hallo,

            Ich denke, der Ergebnistyp von typeof ist hier nicht das Problem.

            Ja, das habe ich erst nicht erkannt. Klar liegt es hier daran, das dem typeof-Operator immer ein String gegeben wird.

            Aber, was schlimmer ist: "typeof null" lügt 'object' und "typeof []" sagt ebenfalls 'object', statt 'array'.

            Nein, da wird nichts gelogen. Ein Array (auch ein leeres) ist ein Objekt, nämlich eine Instanz der Array-Klasse. Und dasselbe gilt für das Null-Objekt.

            Ein Null-Objekt gibt es nicht. Null ist "kein* Objekt. Das ist definitiv eine Lüge von typeof.

            Array ist ein Objekt, das stimmt, aber wenn ich nach "typeof []" frage, interessiert mich das weniger, sondern ich will 'array' als Antwort.

            Gruß, Don P

            1. Moin!

              Nein, da wird nichts gelogen. Ein Array (auch ein leeres) ist ein Objekt, nämlich eine Instanz der Array-Klasse. Und dasselbe gilt für das Null-Objekt.

              Ein Null-Objekt gibt es nicht. Null ist "kein* Objekt. Das ist definitiv eine Lüge von typeof.

              Definitionssache. Javascript sieht Null als Objekt an.

              Array ist ein Objekt, das stimmt, aber wenn ich nach "typeof []" frage, interessiert mich das weniger, sondern ich will 'array' als Antwort.

              Mit welcher Begründung sollte typeof jetzt plötzlich bei Arrays, die nur eine Instanz eines bestimmten Objekts sind, was anderes als "object" zurückliefern. Bei Objekten von Date oder String passiert das ja auch nicht.

              Wenn du wissen willst, ob ein Objekt eine Instanz von Array ist, kannst du ja instanceof oder Array.prototype.isPrototypeOf() verwenden.

              - Sven Rautenberg

              --
              "Love your nation - respect the others."
              1. Hallo,

                Ein Null-Objekt gibt es nicht. Null ist "kein* Objekt. Das ist definitiv eine Lüge von typeof.

                Definitionssache. Javascript sieht Null als Objekt an.

                Tut es nicht. Nur typeof behauptet das. Es gibt auch gar kein "Null", nur "null" als eingebauter Typ wie "false" oder "NaN", die auch keine Objekte sind. In JavaScript ist zwar fast alles ein Objekt, aber null gehört nicht dazu.
                Wenn null deiner Meinung nach als Objekt gilt, dann versuch' doch mal, es zu erweitern, z.B. so:

                [code lang =javascript]
                var myNull = null;
                myNull['neueEigenschaft'] = 'TestString';
                alert( myNull.neueEigenschaft );
                [/code]

                => Error: 'myNull' ist kein Objekt

                Mit welcher Begründung sollte typeof jetzt plötzlich bei Arrays, die nur eine Instanz eines bestimmten Objekts sind, was anderes als "object" zurückliefern. Bei Objekten von Date oder String passiert das ja auch nicht.

                Weil es z.B. für String und Number auch sog. Primitves gibt, für welche typeof dann ein brauchbares Ergebnis liefert. Man muss solche ja nicht unbedingt als Objekte benutzen. Es gibt aber kein primitives Array, sondern die sind immer Objekte, leider. typeof sollte hier IMHO trotzdem 'array' sagen. Natürlich kann man darüber geteilter Meinung sein. Allerdings nicht bei null.

                Gruß, Don P

                1. Hallo,

                  Es gibt auch gar kein "Null", nur "null" als eingebauter Typ wie "false" oder "NaN"

                  Da verwechselst du Werte und Typen.

                  NaN ist ein Wert vom Typ Number (es gibt viele andere Werte vom Typ Number),
                  false ist ein Wert vom Typ Boolean (es gibt noch einen anderen Werte vom Typ Boolean),
                  null ist ein Wert vom Typ Null (es gibt nur diesen Wert des Types Null).

                  In JavaScript ist zwar fast alles ein Objekt, aber null gehört nicht dazu.

                  null ist wie gesagt vom Typ Null, für typeof gelten einfach Sonderregeln.

                  Mit welcher Begründung sollte typeof jetzt plötzlich bei Arrays ... was anderes als "object" zurückliefern.
                  (...) Es gibt aber kein primitives Array, sondern die sind immer Objekte, leider. typeof sollte hier IMHO trotzdem 'array' sagen.

                  Eine Begründung sehe ich da nicht, ich kann mich nur Svens Ausführungen anschließen: typeof ist was anderes als constructor oder instanceof.

                  Mathias

                  1. Hallo,

                    NaN ist ein Wert vom Typ Number (es gibt viele andere Werte vom Typ Number),
                    false ist ein Wert vom Typ Boolean (es gibt noch einen anderen Werte vom Typ Boolean),
                    null ist ein Wert vom Typ Null (es gibt nur diesen Wert des Types Null).

                    Meinetwegen auch vom Typ Null, aber eben kein Objekt, obwohl typeof das behauptet. Darum geht es ja hier. Trotzdem Danke für die Links.

                    null ist wie gesagt vom Typ Null, für typeof gelten einfach Sonderregeln.

                    Genau die Sonderregel für null ist es, die ich hier anprangere. Ich weiß, dass es in der ECMAscript-Spezifikation so festgelegt ist, und dennoch ist es ein Fehler, was inzwischen allgemein anerkannt ist. Man hat damals einfach nicht richtig aufgepasst, und nun ist es eben so. Das macht null aber trotzdem nicht zu einem Objekt, nur weil typeof hier falsch spezifiziert ist. Der ganze Rest von JavaScript kennt kein Null-Objekt.

                    Mit welcher Begründung sollte typeof jetzt plötzlich bei Arrays ... was anderes als "object" zurückliefern.
                    (...) Es gibt aber kein primitives Array, sondern die sind immer Objekte, leider. typeof sollte hier IMHO trotzdem 'array' sagen.

                    Eine Begründung sehe ich da nicht, ich kann mich nur Svens Ausführungen anschließen: typeof ist was anderes als constructor oder instanceof.

                    Zugegeben, das Ergebnis von "typeof []" ist Geschmacksache. Es wäre m.E. eben sinnvoll, wenn 'array' herauskäme. Wegen typeof "" === 'string', typeof 0 === 'number', typeof false === 'boolean' usw. wäre es einfach schön, wenn auch typeof [] === 'array' gelten würde.
                    Dass typeof null === 'object' gilt, ist jedenfalls kompletter Unsinn.

                    Klar kann ich für Arrays auch constructor oder instanceof bemühen, aber muss das denn unbedingt sein? Wenn ich ein Array habe, dann interessiert es mich nicht wirklich, dass es auch ein Objekt ist, zumal ja fast alles in JavaScript Objekte sind. Ein Array ist aber schon nochmal etwas besonderes, in allen anderen Programmiersprachen ist das bekanntlich ein eigener, nicht unwichtiger Datentyp. Wenn man schon einen typeof Operator in einer ansonsten schier typlosen Sprache etabliert, dann sollte der doch auch sinnvolle Ergebnisse liefern, meine ich.

                    Gruß, Don P

                    1. Hallo,

                      Es wäre m.E. eben sinnvoll, wenn 'array' herauskäme. Wegen typeof "" === 'string', typeof 0 === 'number', typeof false === 'boolean' usw. wäre es einfach schön, wenn auch typeof [] === 'array' gelten würde.

                      Du wiederholst dich. Sowohl Sven als auch du selbst haben aber schon gesagt, warum dies eine Inkonsistenz wäre, würde man nicht komplett den Unterschied zwischen typeof und constructor aufweichen, sodass auch typeof(new MeinKonstruktor) == "MeinKonstruktor" wäre.

                      Wenn ich ein Array habe, dann interessiert es mich nicht wirklich, dass es auch ein Objekt ist

                      ...dann verwende nicht typeof, sondern den Operator bzw. die Eigenschaft, die das liefern, was dich interessiert.

                      Ein Array ist aber schon nochmal etwas besonderes, in allen anderen Programmiersprachen ist das bekanntlich ein eigener, nicht unwichtiger Datentyp.

                      JavaScript hat halt ein ziemlich einzigartiges Typenkonzept.

                      Wenn man schon einen typeof Operator in einer ansonsten schier typlosen Sprache etabliert, dann sollte der doch auch sinnvolle Ergebnisse liefern, meine ich.

                      Was typeof leisten soll, leistet es vorzüglich. Für andere Aufgaben sind andere Methoden bereits vorgesehen.

                      Ich will hier nicht über ein potenziell besseres JavaScript spekulieren. Innerhalb vom jetzigen JavaScript hat typeof die von mir beschriebene Funktion und innerhalb dieses Rahmens ist es auch sinnvoll, dass typeof nicht identisch mit constructor bzw. instanceof ist.

                      Mathias

                    2. gruss Don P,

                      ...

                      null ist ein Wert vom Typ Null (es gibt nur diesen Wert des Types Null).

                      Meinetwegen auch vom Typ Null, aber eben kein Objekt, obwohl typeof
                      das behauptet.

                      ... tut er doch gar nicht. da »ECMA 262«-konforme implementationen allesamt
                      schwach und dynamisch typisiert kann ein »typeof«-operator nur die primitiven
                      typen [undefined], [string], [boolean] und [number] von funktionen, objekten
                      und eben dem [null]-zeiger unterscheiden.

                      »typeof« wird niemals den korrekten "datentyp" eines objekts ermitteln koennen,
                      eben weil es im sprachkonzept keine strengen auspraegungen solcher typen gibt.

                      ... Darum geht es ja hier. Trotzdem Danke für die Links.

                      null ist wie gesagt vom Typ Null, für typeof gelten einfach Sonderregeln.

                      Genau die Sonderregel für null ist es, die ich hier anprangere. Ich weiß,
                      dass es in der ECMAscript-Spezifikation so festgelegt ist, und dennoch ist
                      es ein Fehler, ...

                      da [null] als definierter *NICHT-TYP* die abwesenheit aller anderen typen
                      voraussetzt, finde ich es nur konsequent, dass der »typeof«-operator, in einer
                      sprache, die bis auf die genannten ermittelbaren ausnahmen nur noch die typen
                      [function] und [object] *kennt* in ebendiesem fall "object" zurueckliefert.

                      ... was inzwischen allgemein anerkannt ist.

                      ... wankelmuetige kleingeister das alles ;-)

                      ... Man hat damals
                      einfach nicht richtig aufgepasst, und nun ist es eben so. Das macht null
                      aber trotzdem nicht zu einem Objekt, nur weil typeof hier falsch
                      spezifiziert ist. Der ganze Rest von JavaScript kennt kein Null-Objekt.

                      richtig, und dass hat auch niemand behauptet, auch nicht der »typeof«-operator.

                      nocheinmal ... das *type* in »typeof« steht in JavaScript NICHT fuer den
                      "datentyp" einer wie auch immer gearteten objektinstanz. es wird nur nach
                      primitiven typen und objekten unterschieden. und da [[Function]] eine
                      sonderstellung[*1] einnimmt, wird eben noch zwischen [function] und [object]
                      differenziert.

                      [*1] JavaScript - Grundkonzepte ... und dort:
                      »Funktionen als Datentypen: ...« sowie
                      »Funktionen als Konstruktoren von Objekten eines bestimmten Typs: ...«

                      ...

                      Mit welcher Begründung sollte typeof jetzt plötzlich bei Arrays ...
                      was anderes als "object" zurückliefern.
                      (...) Es gibt aber kein primitives Array, sondern die sind immer
                      Objekte, leider. typeof sollte hier IMHO trotzdem 'array' sagen.

                      Eine Begründung sehe ich da nicht, ich kann mich nur Svens Ausführungen
                      anschließen: typeof ist was anderes als constructor oder instanceof.

                      Zugegeben, das Ergebnis von "typeof []" ist Geschmacksache.

                      nein - die namenswahl des operators ist zugegebenermassen ungluecklich, weil
                      so oft missverstanden; ersteres (das ergebnis) hingegen ist wohlueberlegt.

                      Es wäre m.E. eben sinnvoll, wenn 'array' herauskäme. Wegen typeof "" === 'string',
                      typeof 0 === 'number', typeof false === 'boolean' usw. ...

                      alles *primitives*

                      wäre es einfach schön,

                      ... waere es in hoechstem masse inkonsequent ...

                      wenn auch typeof [] === 'array' gelten würde.

                      [[Array]]-instanzen sind schlussendlich objekte.

                      wie z.b. sollte »typeof« folgendes dilemma loesen:

                      var Collection = (function () {  
                        
                       /* code */  
                        
                       var cnstr = (function () {  
                        
                       /* code */  
                        
                       });  
                       cnstr.prototype = [];  
                        
                       return cnstr;  
                        
                      })();  
                        
                        
                      var coll = new Collection();  
                        
                      alert(coll instanceof Collection); // [true]  
                      alert(coll instanceof Array); // [true]  
                      alert(coll instanceof Object); // [true]  
                        
                      alert(typeof coll); // "object"  
                        
                      alert(coll.constructor); // [[Array]]: (function Array () {[native code]})
                      

                      Dass typeof null === 'object' gilt, ist jedenfalls kompletter Unsinn.

                      siehe oben.

                      Klar kann ich für Arrays auch constructor oder instanceof bemühen, aber muss
                      das denn unbedingt sein? Wenn ich ein Array habe, dann interessiert es mich
                      nicht wirklich, dass es auch ein Objekt ist, zumal ja fast alles in JavaScript
                      Objekte sind. Ein Array ist aber schon nochmal etwas besonderes, in allen anderen
                      Programmiersprachen ist das bekanntlich ein eigener, nicht unwichtiger Datentyp.

                      siehe missverstaendlichkeit »typeof« vs "datentyp" und
                      siehe JavaScripts schwaches und dynamisches typenkonzept.

                      Wenn man schon einen typeof Operator in einer ansonsten schier typlosen Sprache
                      etabliert, dann sollte der doch auch sinnvolle Ergebnisse liefern, meine ich.

                      http://www.pseliger.de/jsExtendedApi/jsApi.Object.typeDetection.js
                      http://www.pseliger.de/jsExtendedApi/jsApi.Object.typeDetection.new.dev.js

                      so long - peterS. - pseliger@gmx.net

                      --
                      »Because objects in JavaScript are so flexible, you will want to think differently about class hierarchies.
                      Deep hierarchies are inappropriate. Shallow hierarchies are efficient and expressive.« - Douglas Crockford
                      ie:( fl:) br:> va:( ls:& fo:) rl:) n3;} n4:} ss:} de:µ js:} mo:? zu:]
                      1. Hallo,

                        da »ECMA 262«-konforme implementationen allesamt
                        schwach und dynamisch typisiert kann ein »typeof«-operator nur die primitiven
                        typen [undefined], [string], [boolean] und [number] von funktionen, objekten
                        und eben dem [null]-zeiger unterscheiden.

                        Von null ja gerade nicht, sonst würde nicht 'object' rauskommen.

                        da [null] als definierter *NICHT-TYP* die abwesenheit aller anderen typen voraussetzt [...]

                        Definierter *NICHT-TYP*? Wo hast du denn das her? Außer den von dir genannten [undefined], [string], [boolean], [number] sowie Funktionen und Objekten gibt es auch noch null und NaN. Wieso sollte gerade null ein definierter NICHT-TYP sein? Gilt das auch für NaN (da würde ich es noch eher akzeptieren)?

                        ... wankelmuetige kleingeister das alles ;-)

                        *LOL*

                        Der ganze Rest von JavaScript kennt kein Null-Objekt.

                        richtig, und dass hat auch niemand behauptet, auch nicht der »typeof«-operator.

                        Doch, in diesem Thread wurde das behauptet, gerade deshalb ist er überhaupt so langhandhabig geworden.

                        nocheinmal ... das *type* in »typeof« steht in JavaScript NICHT fuer den
                        "datentyp" einer wie auch immer gearteten objektinstanz. es wird nur nach
                        primitiven typen und objekten unterschieden. und da [[Function]] eine
                        sonderstellung[*1] einnimmt, wird eben noch zwischen [function] und [object]
                        differenziert.

                        Ja doch. Ihr wollt mir hier immer erklären, wie typeof in JavaScript fuktioniert, als ob ich das nicht wüsste. Ich will euch dagegen erklären, wie typeof in JavaScript funktionieren *sollte*, damit man sinnvollere Ergebnisse erhält, als es der Fall ist.

                        nein - die namenswahl des operators ist zugegebenermassen ungluecklich, weil
                        so oft missverstanden; ersteres (das ergebnis) hingegen ist wohlueberlegt.

                        Jetzt ist es also die Namenswahl, naja. Man hätte das Ding besser "guesstype" getauft, stimmts?

                        [[Array]]-instanzen sind schlussendlich objekte.

                        Klar doch, aber wen interessiert denn das? Wie für Funktionen wäre hier eine Extrawurst sinnvoll gewesen, Inkonsequenz hin oder her.

                        wie z.b. sollte »typeof« folgendes dilemma loesen:
                        [...]
                        alert(coll instanceof Collection); // [true]
                        alert(coll instanceof Array); // [true]
                        alert(coll instanceof Object); // [true]

                        alert(typeof coll); // "object"

                        alert(coll.constructor); // [[Array]]: (function Array () {[native code]})[/code]

                        Ist doch klar: typeof sollte 'array' zurückgeben. Dass es ein Objekt ist, interessiert nicht wirklich, und dass das Array als "Collection"- Objekt konstruiert wurde, auch nicht. Wichtig ist nur, dass es eine Array-Natur hat, mit den entsprechenden Eigenschaften und Methoden.

                        Dass typeof null === 'object' gilt, ist jedenfalls kompletter Unsinn.

                        siehe oben.

                        Genau: siehe oben.

                        Wenn man schon einen typeof Operator in einer ansonsten schier typlosen Sprache
                        etabliert, dann sollte der doch auch sinnvolle Ergebnisse liefern, meine ich.

                        http://www.pseliger.de/jsExtendedApi/jsApi.Object.typeDetection.js
                        http://www.pseliger.de/jsExtendedApi/jsApi.Object.typeDetection.new.dev.js

                        Hey, super Links! Vielen Dank, sowas hab' ich gesucht :-) Wenn auch auf den ersten Blick etwas zu viel des Guten. Soo schlecht ist typeof ja auch wieder nicht, man muss nur für null und für Arrays, vielleicht auch noch für RegExp-Objekte das Ergebnis ein bisschen zurechtbiegen.

                        Gruß, Don P

        2. Hallo,

          "typeof []" sagt ebenfalls 'object', statt 'array'.

          Nochmal: Array ist kein »Typ«.
          Array ist genauso bzw. genausowenig ein »Typ« wie Date, Number, Boolean, String, RegExp, Function und meinEigenerKonstruktor. In all diesen Fällen von Objekten gibt mir typeof auch nur "object". typeof ist gedacht zur Unterscheidung von Objects und Primitives und, wenn letzteres, Unterscheidung nach Primitives. Das ist alles. Was du suchst, ist höchstens [].constructor. DAS liefert mir bei Array-Objekten Array, bei Date-Objekten Date, bei Number-Objekten Number usw. usf. (Bei Primitives geht das auch, also bspw. "".constructor oder (1).constructor, weil die in dem Moment in Objekte umgewandelt werden.)

          Mathias

          1. Hallo,

            Nochmal: Array ist kein »Typ«.
            typeof ist gedacht zur Unterscheidung von Objects und Primitives und, wenn letzteres, Unterscheidung nach Primitives. Das ist alles.

            Das weiß ich doch. Es sollte m.E. aber ein Primitive für Array geben, z.B. wenn man es literal [] notiert, und nicht explizit mit "new Array()", so wie das auch mit Strings usw. möglich ist. Da es nunmal kein Array-Primitive gibt, wäre es schön, wenn typeof hier wenigstens ausnahmsweise 'array' zurückgäbe, obwohl es sich um ein Objekt handelt.

            Schließlich gibt typeof für null auch ausnahmsweise 'object' zurück, was das noch viel falscher ist. DAS wollt ihr anscheinend einfach hinnehmen, ein typeof [] === 'array' lehnt ihr dann aber wieder ab. Versteh' das, wer will.

            Gruß, Don P

            1. Hallo,

              Das weiß ich doch. Es sollte m.E. aber ein Primitive für Array geben, z.B. wenn man es literal [] notiert

              Was hat das nun miteinander zu tun ... RegExp hat auch eine Literalschreibweise, willst du auch ein RegExp-Primitive?

              Primitive Values sind als einfache, unzusammengesetzte Werte definiert, die immer als einfache Werte übergeben werden.
              Objects sind alle zusammengesetzte Werte, haben Konstruktoren, erben über Prototypen, werden als Referenzen übergeben usw.

              Ich wüsste nicht, wie in das Schema hineinpassen würde, dass ein Array ein Primitive sein könnte. Aber ich muss es auch nicht wissen...

              Schließlich gibt typeof für null auch ausnahmsweise 'object' zurück, was das noch viel falscher ist. DAS wollt ihr anscheinend einfach hinnehmen, ein typeof [] === 'array' lehnt ihr dann aber wieder ab.

              Das sind zwei unterschiedliche Debatten, die nichts miteinander zu tun haben.
              typeof(null) kann meinetwegen "null" oder ähnliches ergeben, das wäre keine Inkonsistenz.

              Mathias

              1. Hallo,

                typeof(null) kann meinetwegen "null" oder ähnliches ergeben, das wäre keine Inkonsistenz.

                Und wie ist es mit 'function'? Auch keine Inskonsistenz? Funktionen sind doch Objekte und keine Primitives.

                Gruß, Don P

          2. Und noch etwas:

            typeof ist gedacht zur Unterscheidung von Objects und Primitives und, wenn letzteres, Unterscheidung nach Primitives. Das ist alles.

            typeof kann z.B. auch 'function' zurückgeben, obwohl eine Funktion auch nur ein Objekt ist. Das macht aber natürlich Sinn, genau wie ein typeof [] === 'array' Sinn machen würde, während das typeof null === 'object' eben gar keinen Sinn macht.

            Ich benutze jedenfalls folgende Funktion typeOf(), die 'null' für null und 'array' für ein Array liefert, und bin glücklich damit:

            [code lang = javascript]
            var typeOf = function (v){var s=typeof v;if(s!=='object'){return s;}if(!v){return'null';}if(typeof v.length==='number'&&!(v.propertyIsEnumerable('length'))&&typeof v.splice==='function'){return'array';}return s;};
            [/code]

            Gruß, Don P

          3. Shalom!

            Array ist genauso bzw. genausowenig ein »Typ« wie Date, Number, Boolean, String, RegExp, Function und meinEigenerKonstruktor. In all diesen Fällen von Objekten gibt mir typeof auch nur "object".

            Nicht ganz: Für Strings wird die Extrawurst gebraten, die Don P für Arrays fordert.

            Viele Grüße vom Længlich

            1. Hallo,

              Array ist genauso bzw. genausowenig ein »Typ« wie Date, Number, Boolean, String, RegExp, Function und meinEigenerKonstruktor. In all diesen Fällen von Objekten gibt mir typeof auch nur "object".

              Nicht ganz: Für Strings wird die Extrawurst gebraten, die Don P für Arrays fordert.

              Ich hab von Objects geredet. Natürlich liefert typeof bei String-Primitives "string", bei Number-Primitives "number", beim Boolean-Primitive "boolean". (Und, das stimmt, bei Function-Objects "function".)

              Mathias

              1. Hallo,

                (Und, das stimmt, bei Function-Objects "function".)

                Siehste, und gegen einen Rückgabewert "regexp" für ein solches Objekt hätte ich auch nichts einzuwenden. Deshalb muss man ja nicht gleich ein typeof meinKonstruktor === 'meinKonstruktor' fordern. Auf das richtige Maß kommt es an :-)

                Gruß, Don P

                1. Hallo,

                  (Und, das stimmt, bei Function-Objects "function".)

                  Siehste, und gegen einen Rückgabewert "regexp" für ein solches Objekt hätte ich auch nichts einzuwenden.

                  typeof ist nicht sauber von constructor/instanceof abgegrenzt, das will ich gar nicht leugnen. Warum Function-Objekte eine Ausnahme darstellen, da kann man nur spekulieren.

                  Mathias

              2. Ciao!

                Tatsächlich.
                typeof "bla" liefert "string",
                typeof (new String("bla")) liefert "object".
                Aber
                typeof /regex/ und
                typeof (new RegExp("/regex/")) liefern beide "function". Man muß sich den typeof-Operator also wirklich sehr genau anschauen, bevor man ihn verwendet - intuitiv klar ist dieses Verhalten IMHO nicht gerade.

                Viele Grüße vom Længlich

                1. Hallo,

                  typeof /regex/ und
                  typeof (new RegExp("/regex/")) liefern beide "function".

                  Das z.B. ist ein Fehler, der in ECMAScript 4 gefixt sein wird.

                  Mathias

      2. Moin!

        ich will das ich wenn ich eine Zahl eingebe unter typeof Number erhalte
        wenn ich true eingebe soll da boolean stehen usw...

        Das wird nie passieren. typeof() des Ergebnisses von Prompt ist immer ein String.

        Nochmal die Frage: Warum willst du für typeof() unterschiedliche Ergebnisse haben? Was für ein Effekt soll damit bewirkt werden?

        - Sven Rautenberg

        --
        "Love your nation - respect the others."