Co oznacza [obiekt obiekt]?

122

Próbuję zaalarmować zwróconą wartość z funkcji i otrzymuję to w alercie:

[object Object]  

Oto kod 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 to funkcja, którą próbuję sprawdzić.

Prady
źródło
3
Oznacza to, że typem danych, które zwracasz, jest Object.
Poza zainteresowaniem: czego oczekujesz, że zwróci?
Dancrumb,
1
Powinieneś użyć konsoli JavaScript do introspekcji interesujących cię obiektów (np. Firebug).
Brian Donovan,
Odpowiedź 2 jest bardziej jasną odpowiedzią, czy możesz na nią spojrzeć i wybrać ją jako zaakceptowaną, jeśli czujesz to samo.
Suraj Jain

Odpowiedzi:

53

Domyślna konwersja obiektu na ciąg to "[object Object]".

Jeśli masz do czynienia z obiektami jQuery, możesz chcieć to zrobić

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

wydrukować identyfikator elementu.

Jak wspomniano w komentarzach, powinieneś używać narzędzi dostępnych w przeglądarkach, takich jak Firefox lub Chrome, do introspekcji obiektów, wykonując console.log(whichIsVisible())zamiast alert.

Uwaga : identyfikatory nie powinny zaczynać się cyframi.

Felix Kling
źródło
3
[W HTML5 identyfikatory mogą zaczynać się od cyfr.] ( Whatwg.org/specs/web-apps/current-work/multipage/… )
Matt Ball,
Bardziej ogólnie obawiałbym się, że obiekty mogą nie mieć atrybutu id; na przykład, jeśli masz listę obiektów używając tylko selektora css, takiego jak $ ('. someStyleClass'). Aby mieć jasność co do tożsamości dowolnego obiektu, z którym masz do czynienia, może być przydatne lub przynajmniej interesujące przypisanie metadanych do obiektów za pomocą funkcji jquery .data (), api.jquery.com/data
jsh
136

Jak zauważyli inni, jest to domyślna serializacja obiektu. Ale dlaczego tak jest, [object Object]a nie tylko [object]?

Dzieje się tak, ponieważ w Javascript są różne typy obiektów!

  • Obiekty funkcyjne :
    stringify(function (){})->[object Function]
  • Obiekty tablicowe :
    stringify([])->[object Array]
  • Obiekty RegExp
    stringify(/x/) ->[object RegExp]
  • Obiekty daty
    stringify(new Date) ->[object Date]
  • Jeszcze kilka
  • i obiekty obiektów !
    stringify({})->[object Object]

Dzieje się tak, ponieważ wywoływana jest funkcja konstruktora Object(przez duże „O”), a termin „obiekt” (z małym „o”) odnosi się do strukturalnej natury rzeczy.

Zwykle, kiedy mówisz o „obiektach” w JavaScript, tak naprawdę masz na myśliobiekty obiektów ”, a nie inne typy.

gdzie stringifypowinno wyglądać tak:

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

user123444555621
źródło
Jeśli toString () nie jest zastępowane w niestandardowym obiekcie: zgodnie z dokumentacją 15.2.4.2 Object.prototype.toString () # Ⓣ Ⓔ Ⓡ Gdy wywoływana jest metoda toString, podejmowane są następujące kroki: Jeśli ta wartość jest niezdefiniowana, zwraca " [obiekt Undefined] ”. Jeśli ta wartość jest równa null, zwraca „[object Null]”. Niech O będzie wynikiem wywołania ToObject z przekazaniem wartości this jako argumentu. Niech class będzie wartością wewnętrznej właściwości [[Class]] O. Zwróć wartość typu String, która jest wynikiem połączenia trzech Ciągów „[obiekt”, klasa i „]”.
Treefish Zhang
7
plus jeden za terminologięthingy
Jay Wick,
2
Dobre wytłumaczenie! BTW, JSON.stringify nie jest tym używanym tutaj.
themefield
Czy możesz u góry wyjaśnić, jaka jest twoja funkcja stringify, że tak nie jest JSON.stringify, ktoś może odnieść złe wrażenie.
Suraj Jain
Dlaczego Object.prototype.toString.call(undefined)daje [object Undefined]?
Suraj Jain
21

[object Object] jest domyślną reprezentacją obiektu toString w javascript.

Jeśli chcesz poznać właściwości swojego obiektu, po prostu przejrzyj go w ten sposób:

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

W twoim konkretnym przypadku otrzymujesz obiekt jQuery. Spróbuj zamiast tego:

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

Powinno to ostrzec identyfikator widocznego elementu.

alexn
źródło
> [Object Object] jest domyślną reprezentacją obiektu toString w javascript. - to wciąż nie wyjaśnia, skąd się bierze.
Dmitri Zaitsev
11

Jest to wartość zwracana przez toString()funkcję tego obiektu .


Rozumiem, co próbujesz zrobić, ponieważ wczoraj odpowiedziałem na twoje pytanie dotyczące określenia, który element div jest widoczny. :) zwraca rzeczywisty obiekt jQuery, bo myślałem, że będzie bardziej programowo użyteczne. Jeśli chcesz użyć tej funkcji do celów debugowania, możesz po prostu zrobić coś takiego:
whichIsVisible()

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

To powiedziawszy, naprawdę powinieneś używać odpowiedniego debugera, a nie alert()próbować debugować problem. Jeśli używasz Firefoksa, Firebug jest doskonały. Jeśli używasz IE8, Safari lub Chrome, mają one wbudowane debugery.

Matt Ball
źródło
To nie wydaje się odpowiadać na pytanie.
Dmitri Zaitsev
9

W ten sposób możesz zobaczyć wartość wewnątrz [obiekt obiektu]

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

Spróbuj w ten sposób

    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)  );

odniesienie

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

Ryosuke Hujisawa
źródło
W jaki sposób uzyskasz dostęp, na przykład, do userDate.timezone lub powiedz user.name itp.? W moim programie, jeśli robię JSON.stringify (obiekt), oczywiście widzę wszystko. Kiedy próbuję console.log (obiekt), otrzymuję [obiekt obiektu] ... ale kiedy próbuję console.log (nazwa.obiektu), otrzymuję niezdefiniowany. (JSON.stringify (object.name) nie działa; ja też otrzymuję undefined :()
daCoda
9

Podstawy

Możesz tego nie wiedzieć, ale w JavaScript, ilekroć wchodzimy w interakcję z ciągami, liczbami lub prymitywami logicznymi, wkraczamy w ukryty świat cieni obiektów i przymusu.

string, number, boolean, null, undefined i symbol.

W JavaScript jest 7 prymitywne typy: undefined, null, boolean, string, number, biginti symbol. Wszystko inne jest przedmiotem. Prymitywne typy boolean, stringi numbermogą być owinięte obiektowych ich odpowiedniki. Przedmioty te są instancje Boolean, Stringi Numberkonstruktorzy odpowiednio.

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"

Jeśli prymitywy nie mają właściwości, dlaczego "this is a string".lengthzwraca wartość?

Ponieważ JavaScript z łatwością koeruje między prymitywami a obiektami. W tym przypadku wartość ciągu jest przekształcana w obiekt typu łańcuchowego w celu uzyskania dostępu do długości właściwości. Obiekt string jest używany tylko przez ułamek sekundy, po czym jest składany w ofierze Bogom zbieraczy śmieci - ale zgodnie z duchem programów telewizyjnych, złapiemy nieuchwytne stworzenie i zachowamy je do dalszej analizy…

Aby to jeszcze bardziej zademonstrować, rozważmy następujący przykład, w którym dodajemy nową właściwość do prototypu konstruktora String.

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

W ten sposób prymitywy mają dostęp do wszystkich właściwości (w tym metod) zdefiniowanych przez ich konstruktory obiektów.

Widzieliśmy więc, że typy prymitywne będą odpowiednio przekształcać się w odpowiadające im odpowiedniki Object, gdy będzie to wymagane.

Analiza toString()metody

Rozważmy następujący kod

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"

Jak omówiono powyżej, tak naprawdę dzieje się, gdy wywołujemy toString()metodę na typie pierwotnym, zanim będzie mogła wywołać metodę, musi zostać przekształcona w jej odpowiednik obiektowy.
czyli myNumber.toString()jest odpowiednikiem Number.prototype.toString.call(myNumber)i podobnie dla innych typów pierwotnych.

Ale co, jeśli zamiast przekazywania typu pierwotnego do toString()metody odpowiadającego mu odpowiednika funkcji konstruktora Object, wymuszamy przekazanie typu pierwotnego jako parametru do toString()metody konstruktora funkcji Object ( Object.prototype.toString.call(x))?

Bliższe spojrzenie na Object.prototype.toString ()

Zgodnie z dokumentacją , gdy wywoływana jest metoda toString, wykonywane są następujące kroki:

  1. Jeśli thiswartość to undefined, return "[object Undefined]".
  2. Jeśli thiswartość to null, return "[object Null]".
  3. Jeśli ta wartość nie jest żadną z powyższych, Niech Obędzie wynikiem wywołania, toObjectprzekazując thiswartość jako argument.
  4. Niech class będzie wartością [[Class]]właściwości wewnętrznej O.
  5. Zwraca String wartość, która jest wynikiem łącząc trzy struny "[object ", classi "]".

Zrozum to na podstawie poniższego przykładu

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]"

Źródła: 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 / tajne-życie-prymitywów-javascript /

Himansh
źródło
4

[object Object]jest domyślną reprezentacją ciągu JavaScript Object. Oto, co otrzymasz, jeśli uruchomisz ten kod:

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

Możesz zmienić domyślną reprezentację, zastępując toStringmetodę w następujący sposób:

var o = {toString: function(){ return "foo" }};
alert(o); // foo
Brian Donovan
źródło
4
Co prawie na pewno nie jest tym, czego on chce.
Wyścigi lekkości na orbicie
1
To prawda, tylko pokazuję, skąd [object Object]pochodzi struna.
Brian Donovan,
Wyjaśniasz, jak zmienić domyślną reprezentację, a nie skąd pochodzi oryginalna.
Dmitri Zaitsev
2

Masz obiekt javascript

$1i $2są obiektami jquery, mogą być używane alert($1.text());do pobierania tekstu lub alert($1.attr('id');itp ...

musisz traktować $1i $2lubić obiekty jQuery.

jondavidjohn
źródło
0

Próbujesz zwrócić obiekt. Ponieważ nie ma dobrego sposobu na przedstawienie obiektu jako ciągu znaków, wartość obiektu .toString()jest automatycznie ustawiana jako "[object Object]".

Eric Xue
źródło