2010-03-25 4 views
24

Wie pro http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf, JavaScript 6 Typen: undefined, null, boolean, string, number und object.JavaScript-Typ

var und; 
console.log(typeof und); // <-- undefined 

var n = null; 
console.log(typeof n); // <--- **object**! 

var b = true; 
console.log(typeof b); // <-- boolean 

var str = "myString" 
console.log(typeof str); // <-- string 

var int = 10; 
console.log(typeof int); // <-- number 

var obj = {} 
console.log(typeof obj); // <-- object 

Frage 1:

Warum null vom Typ object statt null?

Frage 2:

Was funktioniert?

var f = function() {}; 
console.log(typeof f); // <-- function 

Variable f hat Typ function. Warum ist es in der Spezifikation nicht als separater Typ spezifiziert?

Danke,

+3

+1 in der Spezifikation zu graben, für ganzheitliche Aufklärung suchen. –

Antwort

13

über typeof null == 'object', dies ein Fehler ist, die seit den frühen Tagen kommen und leider den Fehler mit uns für eine lange Zeit bleiben, war es too late Ausgabe Spezifikation im ECMAScript 5. fixiert werden.

Über die Funktionen sind sie nur Objekte, aber sie haben eine spezielle interne Eigenschaft namens [[Call]], die intern verwendet wird, wenn eine Funktion aufgerufen wird.

Der Operator typeof unterscheidet zwischen einfachen Objekten und Funktionen, indem er prüft, ob das Objekt diese interne Eigenschaft hat.

5

Es ist, weil typeof zurückzukehren „Objekt“ definiert ist, wenn der Eingang null ist, und zurück „Funktion“, wenn der Eingang aufrufbar ist. (Siehe 11.4.3 Der typeof Operator.)

Ich weiß nicht, warum der Standard so definiert ist (and Crockford said it's wrong). Vielleicht Rückwärtskompatibilität.

0

Antwort auf Frage 1:

Eine Eigenschaft, wenn es keine Definition hat, nicht definiert ist. Der Grund null ist ein Objekt ist so, dass eine Eigenschaft ohne Wert existieren kann und trotzdem eine Definition hat.

+1

Eigentlich finde ich das irreführend. Es besteht ein Unterschied zwischen undefiniert und nicht deklariert. Zum Beispiel wird 'var x' eine Eigenschaft namens' x' in den aktuellen Bereich einfügen, aber sein Wert wird 'undefiniert'. Bevor dies geschieht, ist "x" selbst undefiniert und der Versuch, es zu verwenden, führt zu einem "ReferenceError". – bcherry

+1

Außerdem ist 'null' kein * Objekt *, es ist ein * primitiver Wert *, leider ist der 'typeof'-Operator einfach falsch ... – CMS

0

typeof null === "object" weil die Spezifikation so sagt, aber das ist ein Fehler von der allerersten Version von JavaScript. (wie KennyTM oben sagt).

typeof f === "function" weil, ohne eine try/catch, gibt es keine andere zuverlässige, narrensichere Möglichkeit festzustellen, ob etwas aufrufbar ist. Verwenden f.constructor === Functionkönnte arbeiten, aber ich denke, es ist nicht garantiert, so zu sein.

0

Der Vollständigkeit halber ist zu beachten, dass die aktuelle Best-Practice-Wege-Informationen zu überprüfen, so etwas wie dieses:

var typeInfo = Object.prototype.toString.call(yourObject); 

, dass Sie eine Zeichenfolge gibt, die wie „[object Etwas]“ sieht, wo „Something“ ist ein Typname.

+0

' Object.prototype.toString.call (undefined) 'gibt mir' [ Objektfenster] 'in Firefox o_O. – kennytm

+0

KennyTM: Das ist, weil, wenn 'null' oder' undefined' als das erste Argument von 'call' oder' apply' verwendet werden, der Kontext (das Schlüsselwort 'this') in der aufgerufenen Funktion auf das globale Objekt gesetzt wird. – CMS

+0

Richtig - wenn Sie diese Technik verwenden, würden Sie wahrscheinlich zuerst einen expliziten === Test für undefined durchführen – Pointy

0

Null ist ein spezieller Wert - es ist nicht falsch, es ist nicht 0, oder die leere Zeichenfolge oder NaN oder undefiniert.

null ist, was Sie bekommen, wenn Sie nach einem Objekt suchen, das nicht ist nicht eine undefinierte Eigenschaft eines Objekts, aber die Sache selbst.

ein Absatz mit einem textNode wird Null für die Knoten nextSibling, eine Regexp zurückgeben, die keine Übereinstimmung zurückgibt null anstelle des Arrays und so weiter.

vielleicht sollte es einen eigenen Typ haben, aber dann fängt es an, etwas zu sein, ein etwas mit einem Typ, anstatt der Abwesenheit eines Objekts.

0

Es gibt auch Array.prototype.

  • Object.prototype
  • Array.prototype
  • Function.prototype
  • Number.prototype
  • String.prototype
  • Boolean.prototype

Crockford sagt nicht zu verwenden, :

  • neue Nummer()
  • new String()
  • new Boolean()