2016-02-03 11 views
9

Il MDN ha detto:Qual è il tipo di dati della funzione: funzione o oggetto? in JavaScript

Sei tipi di dati che sono primitive:

  • booleano
  • Null
  • indefinito
  • Numero
  • String
  • Simbolo (nuovo in ECMAScript 6)

  • ed oggetto

Ma confuso, il tipo di dati tipo di dati funzione e l'oggetto.

Vediamo:

var func = function() { 
    console.log ('Hello World ! ') 
}; 

var obj = { 
    property : something 
} 


console.log(typeof(func)); // ===> function 
console.log(typeof(obj)); // ===> object 

è diverso tipo di dati funzione ed i dati oggetto di tipo? Perché typeof(func) è una funzione? non un oggetto? Il documento dice che ci sono 7 tipi di dati (6 primitivi, 1 oggetto). la funzione non è inclusa ovunque.

Fino ad ora, per 1 anno, penso che il tipo di dati della funzione sia oggetto, ho sentito che la funzione è oggetto di prima classe in JavaScript, quindi non ho dubbi sulla funzione è oggetto ma oggi penso più tempo e mi chiedo .

È diverso?

+1

Restituisce funzione ma è un oggetto funzione https: //developer.mozilla.org/it-it/docs/Web/JavaScript/Reference/Operators/typeof –

+2

'typeof' non restituisce il * Tipo di dati *. – Bergi

+1

'typeof' non riporta il vero tipo di dati del valore. È una tabella di ricerca che associa il tipo di dati e altre caratteristiche del valore a un nome: http://www.ecma-international.org/ecma-262/6.0/index.html#sec-typeof-operator. Le funzioni sono oggetti che hanno una proprietà interna '[[Call]]'. Ecco perché 'typeof null' è' "oggetto" '(\ * faccia scontrosa \ *). –

risposta

7

È possibile pensare logicamente a Function come sottoclasse di Object. Ha tutti i metodi di Object più alcuni che sono specifici di una funzione (come ad esempio .bind(), .call(), .apply(), ecc ...).

Perché Javascript deciso di fare Function rapporto il suo tipo unico, ma non Array (che è una derivazione simile da Object) è indovinare di nessuno e probabilmente solo conosciuto per i progettisti originali del linguaggio. È estremamente utile che lo Function riporti il ​​proprio tipo in modo da poter controllare facilmente se una proprietà è richiamabile come funzione e forse questo è il motivo principale per cui è stato fatto in questo modo.

Ecco la dimostrazione di come un oggetto Function ha i metodi da un Object:

function f() {} 
 
f.someProperty = "foo"; 
 

 
log(f.hasOwnProperty("someProperty")); 
 
log(f instanceof Object); 
 
log(f instanceof Function); 
 

 
function log(x) { 
 
    var div = document.createElement("div"); 
 
    div.innerHTML = x; 
 
    document.body.appendChild(div); 
 
}

+0

Dove 'Object.create (null)' si adatta a questa gerarchia di classi? – Bergi

+0

* le funzioni * non sono caratterizzate dall'essere 'instanceof Function' in JavaScript, sono speciali perché sono oggetti ** callable **. – Bergi

+0

@Bergi - Ma una funzione è 'instanceof Function'. 'Object.create (null)' è un po 'strano da quando non ha un prototipo. Si potrebbe pensare ad esso come il genitore di 'Object', suppongo dal momento che offre la sintassi dell'accessorio proprietà comune. – jfriend00

0

typeof restituisce il tipo di cosa mai è passato ad esso. Una funzione è un oggetto ((function() {}) instanceof Object === true), ma la funzione typeof è definita per restituire "function" quando un oggetto che implementa [[Call]] in ECMA-262 viene fornito ad esso.

Le funzioni sono oggetti, ma typeof le considera come un caso speciale.

+0

* "quando viene fornito un oggetto con un metodo' call' "* - Mi permetto di dissentire. 'typeof {call: function() {}}' restituisce 'object'. – SeinopSys

+1

Si potrebbe presumere che si intenda il metodo speciale * interno [[call]] *, ma il testo è davvero confuso – Bergi

+0

@bergi Sì, ho cambiato il testo per quello – Ivan

Problemi correlati