Cosa significa [oggetto Oggetto]?


122

Sto cercando di avvisare un valore restituito da una funzione e ottengo questo nell'avviso:

[object Object]  

Ecco il codice JavaScript:

<script type="text/javascript">
$(function ()
{
var $main = $('#main'),
    $1 = $('#1'),
    $2 = $('#2');

$2.hide(); // hide div#2 when the page is loaded

$main.click(function ()
{
    $1.toggle();
    $2.toggle();
});

 $('#senddvd').click(function ()
{
   alert('hello');
   var a=whichIsVisible();
   alert(whichIsVisible());
});

function whichIsVisible()
{
    if (!$1.is(':hidden')) return $1;
    if (!$2.is(':hidden')) return $2;
}

 });

 </script>

whichIsVisible è la funzione che sto cercando di controllare.


3
Significa che il tipo di dati di ciò che stai restituendo è un oggetto.

Per interesse: cosa ti aspetti che ritorni?
Dancrumb

1
Dovresti usare una console JavaScript per analizzare gli oggetti che ti interessano (ad esempio Firebug).
Brian Donovan


La risposta 2 è una risposta più chiara, puoi dargli un'occhiata e sceglierla come risposta accettata se ti senti lo stesso.
Suraj Jain

Risposte:


53

La conversione predefinita da un oggetto a una stringa è "[object Object]".

Dato che hai a che fare con oggetti jQuery, potresti volerlo fare

alert(whichIsVisible()[0].id);

per stampare l'ID dell'elemento.

Come accennato nei commenti, dovresti utilizzare gli strumenti inclusi in browser come Firefox o Chrome per analizzare gli oggetti facendo console.log(whichIsVisible())invece di alert.

Nota a margine : gli ID non devono iniziare con cifre.


3
[In HTML5, gli ID possono iniziare con cifre.] ( Whatwg.org/specs/web-apps/current-work/multipage/… )
Matt Ball

Più in generale sarei preoccupato che gli oggetti potrebbero non avere un attributo id; per esempio, se hai un elenco di oggetti usando solo un selettore CSS come $ ('. someStyleClass'). Per essere chiari sull'identità di qualsiasi oggetto con cui hai a che fare, potrebbe essere utile o almeno interessante assegnare i metadati ai tuoi oggetti utilizzando la funzione jquery .data (), api.jquery.com/data
jsh

136

Come altri hanno notato, questa è la serializzazione predefinita di un oggetto. Ma perché è [object Object]e non solo[object] ?

Questo perché ci sono diversi tipi di oggetti in Javascript!

  • Oggetti funzione :
    stringify(function (){})->[object Function]
  • Oggetti array :
    stringify([])->[object Array]
  • Oggetti RegExp
    stringify(/x/) ->[object RegExp]
  • Oggetti data
    stringify(new Date) ->[object Date]
  • ... molti altri ...
  • e oggetti oggetto !
    stringify({})->[object Object]

Questo perché viene chiamata la funzione di costruzione Object (con una "O" maiuscola) e il termine "oggetto" (con una "o" piccola) si riferisce alla natura strutturale della cosa.

Di solito, quando parli di "oggetti" in Javascript, in realtà intendi " Oggetti oggetto " " e non gli altri tipi.

dove stringifydovrebbe apparire così:

function stringify (x) {
    console.log(Object.prototype.toString.call(x));
}


Se toString () non viene sovrascritto in un oggetto personalizzato: come da documentazione 15.2.4.2 Object.prototype.toString () # Ⓣ Ⓔ Ⓡ Quando viene chiamato il metodo toString, vengono eseguiti i seguenti passaggi: Se questo valore non è definito, restituisci " [oggetto non definito] ". Se questo valore è nullo, restituisce "[object Null]". Sia O il risultato della chiamata a ToObject passando il valore this come argomento. Sia class il valore della proprietà interna [[Class]] di O. Restituisce il valore String che è il risultato della concatenazione delle tre stringhe "[oggetto", classe e "]".
Treefish Zhang

7
più uno per la terminologia dithingy
Jay Wick

2
Buona spiegazione! BTW, JSON.stringify non è quello usato qui.
themefield

Puoi rendere più esplicito in alto quale sia la tua funzione stringify, che non lo è JSON.stringify, qualcuno può dare un'impressione sbagliata.
Suraj Jain,

Perché Object.prototype.toString.call(undefined)[object Undefined]?
Suraj Jain,

21

[object Object] è la rappresentazione predefinita toString di un oggetto in javascript.

Se vuoi conoscere le proprietà del tuo oggetto, basta guardarlo in questo modo:

for(var property in obj) {
    alert(property + "=" + obj[property]);
}

Nel tuo caso particolare, stai ottenendo un oggetto jQuery. Prova a farlo invece:

$('#senddvd').click(function ()
{
   alert('hello');
   var a=whichIsVisible();
   alert(whichIsVisible().attr("id"));
});

Questo dovrebbe avvisare l'id dell'elemento visibile.


> [Object Object] è la rappresentazione predefinita toString di un oggetto in javascript. - questo ancora non spiega da dove provenga.
Dmitri Zaitsev

11

È il valore restituito dalla toString()funzione di quell'oggetto .


Capisco cosa stai cercando di fare, perché ieri ho risposto alla tua domanda su come determinare quale div è visibile. :)
La whichIsVisible()funzione restituisce un oggetto jQuery effettivo, perché ho pensato che sarebbe stato più utile a livello di programmazione . Se vuoi usare questa funzione per scopi di debug, puoi semplicemente fare qualcosa del genere:

function whichIsVisible_v2()
{
    if (!$1.is(':hidden')) return '#1';
    if (!$2.is(':hidden')) return '#2';
}

Detto questo, dovresti davvero usare un debugger appropriato piuttosto che alert()provare a eseguire il debug di un problema. Se stai usando Firefox, Firebug è eccellente. Se utilizzi IE8, Safari o Chrome, hanno debugger integrati.


Questo non sembra rispondere alla domanda.
Dmitri Zaitsev

9

Puoi vedere il valore all'interno di [Object Object] in questo modo

Alert.alert(  JSON.stringify(userDate)  );

Prova in questo modo

    realm.write(() => {
       const userFormData = realm.create('User',{
       user_email: value.username,
       user_password: value.password,
      });
     });

      const userDate = realm.objects('User').filtered('user_email == $0', value.username.toString(), );
      Alert.alert(  JSON.stringify(userDate)  );

riferimento

https://off.tokyo/blog/react-native-object-object/


Come accederesti, ad esempio, a userDate.timezone o diresti user.name ecc.? Nel mio programma, se faccio JSON.stringify (object), ovviamente posso vedere tutto. Quando provo console.log (object), ottengo [Object object] ... ma quando provo console.log (object.name), ottengo undefined. (JSON.stringify (object.name) non funziona; anch'io ottengo undefined :()
daCoda

9

Nozioni di base

Potresti non saperlo ma, in JavaScript, ogni volta che interagiamo con stringhe, numeri o primitive booleane entriamo in un mondo nascosto di ombre di oggetti e coercizione.

stringa, numero, booleano, null, undefined e simbolo.

In JavaScript ci sono 7 tipi primitivi: undefined, null, boolean, string, number, biginte symbol. Tutto il resto è un oggetto. I tipi primitivi boolean, stringe numberpossono essere avvolti dalle loro controparti oggetto. Questi oggetti sono istanze della Boolean, Stringe Numbercostruttori rispettivamente.

typeof true; //"boolean"
typeof new Boolean(true); //"object"

typeof "this is a string"; //"string"
typeof new String("this is a string"); //"object"

typeof 123; //"number"
typeof new Number(123); //"object"

Se le primitive non hanno proprietà, perché "this is a string".lengthrestituisce un valore?

Perché JavaScript forzerà prontamente tra primitive e oggetti. In questo caso il valore della stringa viene forzato a un oggetto stringa per accedere alla lunghezza della proprietà. L'oggetto stringa viene utilizzato solo per una frazione di secondo, dopodiché viene sacrificato agli dei della raccolta dei rifiuti - ma nello spirito degli spettacoli televisivi di scoperta, intrappoleremo la creatura sfuggente e la conserveremo per ulteriori analisi ...

Per dimostrarlo ulteriormente, si consideri il seguente esempio in cui si aggiunge una nuova proprietà al prototipo del costruttore di stringhe.

String.prototype.sampleProperty = 5;
var str = "this is a string";
str.sampleProperty;            // 5

In questo modo le primitive hanno accesso a tutte le proprietà (inclusi i metodi) definite dai rispettivi costruttori di oggetti.

Quindi abbiamo visto che i tipi primitivi forzeranno in modo appropriato la rispettiva controparte Object quando richiesto.

Analisi del toString()metodo

Considera il codice seguente

var myObj    = {lhs: 3, rhs: 2};
var myFunc   = function(){}
var myString = "This is a sample String";
var myNumber = 4;
var myArray  = [2, 3, 5];

myObj.toString();     // "[object Object]"
myFunc.toString();    // "function(){}"
myString.toString();  // "This is a sample String"
myNumber.toString();  // "4"
myArray.toString();   // "2,3,5"

Come discusso in precedenza, ciò che sta realmente accadendo è che quando chiamiamo toString()metodo su un tipo primitivo, deve essere forzato nella sua controparte oggetto prima che possa invocare il metodo.
ie myNumber.toString()è equivalente aNumber.prototype.toString.call(myNumber) e in modo simile per altri tipi primitivi.

Ma cosa succede se invece di passare il tipo primitivo nel toString()metodo della sua controparte della funzione costruttore Object corrispondente, forziamo il passaggio del tipo primitivo come parametro sul toString()metodo del costruttore funzione Object ( Object.prototype.toString.call(x))?

Uno sguardo più da vicino a Object.prototype.toString ()

Come da documentazione , quando viene chiamato il metodo toString, vengono eseguiti i seguenti passaggi:

  1. Se il thisvalore è undefined, restituisci "[object Undefined]".
  2. Se il thisvalore è null, restituisci "[object Null]".
  3. Se questo valore non è nessuno dei precedenti, Sia Oil risultato della chiamata toObjectpassando ilthis valore come argomento.
  4. Sia class il valore della [[Class]]proprietà interna di O.
  5. Restituisce il valore stringa che è il risultato di concatenando i tre corde "[object ", classe "]".

Comprenderlo dal seguente esempio

var myObj       = {lhs: 3, rhs: 2};
var myFunc      = function(){}
var myString    = "This is a sample String";
var myNumber    = 4;
var myArray     = [2, 3, 5];
var myUndefined = undefined;
var myNull      = null;

Object.prototype.toString.call(myObj);        // "[object Object]"
Object.prototype.toString.call(myFunc);       // "[object Function]"
Object.prototype.toString.call(myString);     // "[object String]"
Object.prototype.toString.call(myNumber);     // "[object Number]"
Object.prototype.toString.call(myArray);      // "[object Array]"
Object.prototype.toString.call(myUndefined);  // "[object Undefined]"
Object.prototype.toString.call(myNull);       // "[object Null]"

Riferimenti: https://es5.github.io/x15.2.html#x15.2.4.2 https://es5.github.io/x9.html#x9.9 https://javascriptweblog.wordpress.com/ 2010/09/27 / the-secret-life-of-javascript-primitive /


4

[object Object]è la rappresentazione di stringa predefinita di un JavaScript Object. È ciò che otterrai se esegui questo codice:

alert({}); // [object Object]

Puoi modificare la rappresentazione predefinita sovrascrivendo il toStringmetodo in questo modo:

var o = {toString: function(){ return "foo" }};
alert(o); // foo

4
Che quasi certamente non è quello che vuole fare.
Gare di leggerezza in orbita il

1
Vero, sto solo illustrando da dove [object Object]proviene la stringa.
Brian Donovan

Stai spiegando come modificare la rappresentazione predefinita, non da dove proviene quella originale.
Dmitri Zaitsev

2

Hai un oggetto javascript

$1e $2sono oggetti jquery, forse usati alert($1.text());per ottenere testo o alert($1.attr('id');ecc ...

devi trattare $1e mettere mi $2piace agli oggetti jQuery.


0

Stai tentando di restituire un oggetto. Poiché non esiste un modo valido per rappresentare un oggetto come una stringa, il .toString()valore dell'oggetto viene impostato automaticamente come "[object Object]".

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.