2010-09-24 5 views
12

A cosa serve se restituisce sempre "oggetto" come tipo?Perché il tipo di javascript restituisce sempre "oggetto"?

--update

sempre per elementi o elenchi.

+11

E 'utile perché non lo fa. –

+0

Alcuni client restituiscono typeof = 'function' per nodeLists restituiti da metodi come 'getElementsByTagName'. Lo dico perché recentemente mi ha morso quando lavoro con Safari su Windows. – kennebec

+0

'console.log (typeof" foo "); // string' & 'console.log (typeof String (" foo ")); // string' 'console.log (typeof new String (" foo ")); // object' Presta attenzione all'uso di 'new' – Jowen

risposta

20

Il tipo di J di JS non restituisce sempre "oggetto", ma restituisce l'oggetto per cose che le persone potrebbero non considerare come oggetti - cioè matrici, e anche, stranamente, per null.

Per gli array questo è corretto, perché per quanto riguarda JS, gli array sono oggetti; sono la stessa cosa La matrice è solo un'altra classe e puoi creare un'istanza di oggetti di tipo Array, ma vengono comunque considerati come oggetti.

This page ha un elenco di tipi in JS, insieme alla risposta che otterrete per ognuno di essi da typeof. Ha anche qualche codice JS per sovrascrivere la funzione typeof con una che restituisce informazioni più utili. Se sei preoccupato che non sia utile, potresti implementare qualcosa del genere, se lo desideri.

+0

Google Chrome restituisce ora 'function' per me, quando fornisco 'typeof Array' (o qualsiasi altro tipo di Array, come Int8Array o Float32Array) ... –

+0

Link is dead:/ –

5

Esso non restituisce sempre "oggetto":

alert(typeof "hello"); 

Detto questo, un trucco (forse) più utile per esaminare gli oggetti è quello di utilizzare Object.prototype.toString.call() e guardare il risultato:

var t = Object.prototype.toString.call(itIsAMystery); 

Questo ti darà una stringa come [object Foo] con "Foo" il costruttore (credo) la parte interessante. Per i tipi "nativi" (come Data o Stringa) si ottiene di nuovo il nome del costruttore.

+1

* ... con" Foo "che sta ... * il valore della proprietà interna di' [[Class]] ', che rappresenta - * per gli oggetti nativi * - una specifica definita * classificazione * -non proprio un * tipo *! - e per gli oggetti host in sostanza potrebbe essere qualsiasi cosa .... – CMS

+0

Wow grazie a @CMS! – Pointy

+0

Si noti che l'operatore 'typeof' _viene_ restituisce sempre' "oggetto" 'per lo scope' this' di una funzione _ (a meno che l'ambito non sia una funzione) _. Vedi ["Perché typeof this return" object "?"] (Http://stackoverflow.com/questions/4390658/why-does-typeof-this-return-object) – Phrogz

-1

Devi capire che il sistema di tipi in JavaScript è dinamico con alcuni tipi "primitivi" su cui costruire. Trattando tutti gli oggetti complessi come il tipo "oggetto" ciò consente di digitare e chiamare i metodi senza dover necessariamente conoscere il tipo dell'oggetto che viene passato assumendo che quel tipo abbia la chiamata alla funzione implementata. In un linguaggio di programmazione dinamico tutto è un "oggetto".

+0

Le lingue duck tipate non sempre omettono i tipi - ad esempio, Python è duck dattilografato e ha un tipo utile() che ti dice il tipo di oggetto. – mikemaccana

+0

Potresti riuscire a passare qualsiasi tipo che ti piace ovunque, ma ciò non significa che ci siano _no_ tipi diversi dall'oggetto. – byxor

2

Nella mia esperienza, il problema principale con typeof deriva dalla distinzione tra array, oggetti e null (tutti restituiscono "oggetto").

Per fare questo, ho primo controllo typeof poi verifico il caso nullo o il costruttore "dell'oggetto", in questo modo:

for (o in obj) { 
    if (obj.hasOwnProperty(o)) { 
     switch (typeof obj[o]) { 
      case "object": 
       if (obj[o] === null) { 
        //do somethign with null 
       } else { 
        if (obj[o].constructor.name === "Array") { 
         //do something with an Array 
        } else { 
         //do something with an Object 
        } 
       } 
       break; 
      case "function": 
       //do something with a function 
       break; 
      default: 
       //do something with strings, booleans, numbers 
       break; 
     } 
    } 
} 
1

Uno ha bisogno di essere un po 'attenti con l'operatore typeof. Restituisce "oggetto" per un nullo, "numero" per NaN, "numero" per Infinito, "oggetto" per un "nuovo numero (1)" e "oggetto" per un array.

Quando si verifica l'esistenza di una variabile (tipo di variabile! == "indefinito") a volte è necessario prima controllare se (variabile == null) poiché typeof restituisce "oggetto" per una variabile assegnata a null.

Questo è un po 'ovvio, ma bisogna anche fare attenzione a non invocare una funzione durante il controllo di tipoof perché verrà riportato il tipo di ritorno della funzione e non la "funzione".

+0

Questo è stato utile per la mia situazione in quanto avevo numeri, stringhe, null e oggetti su cui stavo passando. Sono stato in grado di isolare gli oggetti dai null per trasformarli. –

1

Per aggiungersi con gli altri, typeof restituisce sia gli oggetti che le primitive. Ci sono 5 tipi primitivi in ​​javascript: undefined, null, boolean, string e number. Tutto il resto è un oggetto. Quando typeof viene applicato a qualsiasi tipo di oggetto diverso da Function, restituisce semplicemente "object".Quando applicato a una funzione, restituisce un oggetto funzione.

Così, ad esempio:

  • typeof vero; // restituisce il tipo primitivo "booleano"
  • typeof 123; // restituisce il tipo primitivo "numero"
  • typeof null // restituisce "oggetto" che è un errore, ma finora non c'è correzione in un'altra versione di ECMAScript, basta parlare di farlo.
  • typeof oggetto // restituisce "oggetto", che ha un senso

di esporre ulteriormente la risposta di punta, non v'è in ogni JavaScript Object una proprietà interna nota come [[Classe]] in ECMAScript 5. Al fine per visualizzare il valore reale dell'oggetto, è possibile fare riferimento alla proprietà [[Classe]] utilizzando: Object.prototype.toString. Per evitare che alcuni degli oggetti built-in specializzati sovrascrivano toString, si utilizza il metodo interno di Call che rivelerà il tipo di oggetto effettivo.

Così, invece di ottenere l'oggetto generico di ritorno da toString:

var dateObject = Object.prototype.toString(new Date); 
document.write(dateObject);//[object Object] 

è possibile ottenere il tipo di oggetto reale utilizzando chiamate:

var dateObject = Object.prototype.toString.call(new Date); 
document.write(dateObject);//[object Date] 
Problemi correlati