2016-09-13 4 views
3

Hier ist ein einfaches Beispiel für eine Funktion und deren Datentyp:JavaScript-Datentyp Funktion Gültigkeit

Code Snippet:

function hello(){ 
    console.log("hello"); 
} 
console.log(typeof(hello)); //function 

Abfrage:

In JavaScript diesen sind die Datentypen:

1. Object 
2. Primitives - String, number, boolean, null, undefined, symbol(ECMA6) 

Wenn es keinen Datentyp namens "function" gibt, dann wie bekomme ich in der Welt den Datentyp Funktion (obwohl logisch korrekt). Außerdem wird textlich geschrieben, dass der Datentyp der Funktion ein Objekt ist. Also, ich muss Ergebnis als Objekt haben.

Kann jemand diese Verwirrung klären?

+0

[__Der Operator typeof gibt eine Zeichenfolge zurück, die den Typ des nicht bewerteten Operanden angibt .__] (https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Operators/typeof), Nicht wirklich ein ' Dateityp' – Rayon

+0

Weil "Funktion" ist, was die Spezifikation sagt, um zurückzukehren? (Das macht Sinn, während "typeof null" "object" zurückgibt.) – nnnnnn

+0

Ja, beide Fälle sind verwirrend.Gibt es noch eine andere Möglichkeit, den Datentyp einer anderen Variable als typeof zu testen, da sie die Spezifikation zurückgibt oder den Typ des nicht bewerteten Operanden angibt? (Wie die obigen 2 Kommentare) – Deadpool

Antwort

4

Ja, Sie haben recht, es gibt keinen function Typ, es ist nur ein Hack im typeof Operator, der "function" für Objekte zurückgibt, die aufrufbar sind.

Referenz: http://www.ecma-international.org/ecma-262/6.0/#sec-typeof-operator

Generell typeof den Namen tatsächlichen Typ zurückgibt, mit zwei Ausnahmen:

  • typeof null kehrt object, aber die Art der null ist Null
  • typeof <func> kehrt function, aber die Art von <func> ist Object
+0

Dies bedeutet, dass die richtige Antwort nur Objekt hätte sein sollen, aber im aktuellen Szenario aufgrund einiger Spezifikationen - "Es gibt Funktion", aber in Wirklichkeit hätte es "Objekt"? – Deadpool

+0

@Peterson: ja, siehe Update – georg

+0

Fügen Sie auch typeof (Nan) === "Nummer" in der Ausnahmeliste hinzu! – Deadpool

2

Von der „Sie wissen nicht, JS Buch“ von Kyle Simpson:

Also, was ist der siebte Zeichenfolge-Wert, kann typeof zurückkehren?

typeof function a(){ /* .. */ } === "function"; // true 

Es ist einfach diese Funktion zu denken, wäre ein Top-Level-Einbau-Typ in JS, insbesondere dieses Verhalten des typeof-Operator gegeben sein. Wenn Sie jedoch die Spezifikation lesen, werden Sie sehen, dass es eigentlich ein "Untertyp" des Objekts ist. Insbesondere wird eine Funktion als "Callable Object" bezeichnet - ein Objekt, das eine interne [[Call]] - Eigenschaft hat, die es erlaubt, aufgerufen werden.

Es wurde gemacht, um "abrufbare" Objekte von "nicht abrufbaren" zu unterscheiden.

+0

Ich glaube, dass Funktion sollte ein Datentyp selbst sein oder mindestens anstelle von Funktion zurückgeben --- Typ von Rückkehr sollte "Callable Object" gewesen sein - Das wäre sinnvoller gewesen! – Deadpool

+0

Funktionen haben ein gewisses Objektverhalten - es hat einen Prototyp, Eigenschaften (wie "length" - die Anzahl der Argumente, "name", etc) und Methoden (einschließlich objektspezifischer "toString", "valueOf"), und das könnte sein Grund, warum sie ein Untertyp des Objekts anstelle eines separaten Typs sind. Das Wort "Funktion" wird wahrscheinlich verwendet, um Verwirrung bei Personen zu vermeiden, die aus anderen Sprachen kommen. – EternalLight

Verwandte Themen