Что означает [объект Объект]?

122

Я пытаюсь предупредить возвращаемое значение из функции и получаю это в предупреждении:

[object Object]  

Вот код 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 это функция, которую я пытаюсь проверить.

Пради
источник
3
Это означает, что типом данных, которые вы возвращаете, является Object.
Из интереса: что вы ждете от него?
Dancrumb
1
Вы должны использовать консоль JavaScript для анализа интересующих вас объектов (например, Firebug).
Брайан Донован,
Ответ 2 - более ясный ответ, можете ли вы взглянуть на него и выбрать его как принятый ответ, если вы чувствуете то же самое.
Сурадж Джайн

Ответы:

53

По умолчанию преобразование объекта в строку равно "[object Object]".

Поскольку вы имеете дело с объектами jQuery, вы можете сделать

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

для вывода идентификатора элемента.

Как упоминалось в комментариях, вы должны использовать инструменты, включенные в браузеры, такие как Firefox или Chrome, для интроспекции объектов, выполняя console.log(whichIsVisible())вместо alert.

Примечание : идентификаторы не должны начинаться с цифр.

Феликс Клинг
источник
3
[В HTML5 идентификаторы могут начинаться с цифр.] ( Whatwg.org/specs/web-apps/current-work/multipage/… )
Мэтт Болл,
В более общем плане меня беспокоит то, что у объектов может не быть атрибута id; например, если у вас есть список объектов, просто используя селектор css, например $ ('. someStyleClass'). Чтобы четко идентифицировать любой объект, с которым вы имеете дело, может быть полезно или, по крайней мере, интересно назначить метаданные ваших объектов с помощью функции jquery .data (), api.jquery.com/data
jsh
136

Как отмечали другие, это сериализация объекта по умолчанию. Но почему это [object Object]и не просто так [object]?

Это потому, что в Javascript есть разные типы объектов!

  • Функциональные объекты :
    stringify(function (){})->[object Function]
  • Объекты массива :
    stringify([])->[object Array]
  • Объекты RegExp
    stringify(/x/) ->[object RegExp]
  • Дата объекты
    stringify(new Date) ->[object Date]
  • Еще несколько
  • и объектные объекты !
    stringify({})->[object Object]

Это потому, что вызывается функция-конструктор Object(с заглавной «О»), а термин «объект» (с маленькой «о») относится к структурной природе штуки.

Обычно, когда вы говорите об «объектах» в Javascript, вы на самом деле имеете в виду « объекты-объекты », а не другие типы.

где stringifyдолжно выглядеть вот так:

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

user123444555621
источник
Если toString () не переопределен в настраиваемом объекте: согласно документации 15.2.4.2 Object.prototype.toString () # Ⓣ Ⓔ Ⓡ При вызове метода toString выполняются следующие шаги: Если это значение не определено, вернуть " [объект не определен] ". Если значение this равно нулю, вернуть «[объект Null]». Пусть O будет результатом вызова ToObject с передачей значения this в качестве аргумента. Пусть class будет значением внутреннего свойства [[Class]] объекта O. Верните значение String, которое является результатом объединения трех строк «[object», class и «]».
Treefish Zhang
7
плюс один за терминологиюthingy
Джей Уик
2
Хорошее объяснение! Кстати, JSON.stringify здесь не используется.
themefield 02
Можете ли вы сделать более явным в верхней части, что ваша функция stringify, что это не так JSON.stringify, кто-то может создать неверное впечатление.
Сурадж Джайн
Почему Object.prototype.toString.call(undefined)дает [object Undefined]?
Сурадж Джайн,
21

[object Object] является представлением объекта toString по умолчанию в javascript.

Если вы хотите узнать свойства своего объекта, просто выполните над ним foreach следующим образом:

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

В вашем конкретном случае вы получаете объект jQuery. Попробуйте сделать это вместо этого:

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

Это должно предупредить идентификатор видимого элемента.

AlexN
источник
> [Object Object] - это представление объекта toString по умолчанию в javascript. - это все еще не объясняет, откуда это взялось.
Дмитрий Зайцев
11

Это значение, возвращаемое toString()функцией этого объекта .


Я понимаю, что вы пытаетесь сделать, потому что вчера я ответил на ваш вопрос об определении видимого div. :) функция возвращает реальный объект JQuery, потому что я думал , что будет более программно полезным. Если вы хотите использовать эту функцию для отладки, вы можете просто сделать что-то вроде этого:
whichIsVisible()

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

Тем не менее, вам действительно следует использовать правильный отладчик, а не alert()пытаться отладить проблему. Если вы используете Firefox, Firebug отлично подходит. Если вы используете IE8, Safari или Chrome, у них есть встроенные отладчики.

Мэтт Болл
источник
Кажется, это не отвечает на вопрос.
Дмитрий Зайцев
9

Вы можете увидеть значение внутри [object Object] следующим образом

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

Попробуйте вот так

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

ссылка

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

Рёсукэ Худзисава
источник
Как бы вы могли получить доступ, например, к userDate.timezone или сказать user.name и т. Д.? В моей программе, если я использую JSON.stringify (object), я, очевидно, все вижу. Когда я пробую console.log (объект), я получаю [Object object] ... но когда я пробую console.log (object.name), я получаю undefined. (JSON.stringify (object.name) не работает; я тоже получаю undefined :()
daCoda
9

основы

Вы можете этого не знать, но в JavaScript всякий раз, когда мы взаимодействуем со строковыми, числовыми или логическими примитивами, мы попадаем в скрытый мир теней и принуждения объектов.

строка, число, логическое значение, ноль, неопределенное значение и символ.

В JavaScript существует 7 примитивных типов: undefined, null, boolean, string, number, bigintи symbol. Все остальное - объект. Примитивные типы boolean, stringи numberможет быть обернут их объектные коллегами. Эти объекты являются экземплярами Boolean, Stringи Numberконструкторов соответственно.

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"

Если примитивы не имеют свойств, почему "this is a string".lengthвозвращает значение?

Потому что JavaScript будет легко сопоставлять примитивы и объекты. В этом случае строковое значение приводится к строковому объекту, чтобы получить доступ к длине свойства. Строковый объект используется только в течение доли секунды, после чего его приносят в жертву богам сбора мусора - но в духе телешоу, мы поймем неуловимое существо и сохраним его для дальнейшего анализа ...

Чтобы дополнительно продемонстрировать это, рассмотрим следующий пример, в котором мы добавляем новое свойство в прототип конструктора String.

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

Таким образом, примитивы имеют доступ ко всем свойствам (включая методы), определенным их соответствующими конструкторами объектов.

Итак, мы увидели, что примитивные типы при необходимости будут соответствующим образом приводиться к своему соответствующему объекту-аналогу.

Анализ toString()метода

Рассмотрим следующий код

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"

Как обсуждалось выше, что на самом деле происходит, когда мы вызываем toString()метод для примитивного типа, он должен быть принудительно преобразован в его копию объекта, прежде чем он сможет вызвать метод.
т.е. myNumber.toString()эквивалентно Number.prototype.toString.call(myNumber)и аналогично другим примитивным типам.

Но что, если вместо того, чтобы примитивный тип передавался в toString()метод соответствующего ему аналога функции конструктора объекта, мы принудительно передаем примитивный тип в качестве параметра в toString()метод конструктора функции объекта ( Object.prototype.toString.call(x))?

Взглянем поближе на Object.prototype.toString ()

Согласно документации , когда вызывается метод toString, выполняются следующие шаги:

  1. Если thisзначение - undefinedвернуть "[object Undefined]".
  2. Если thisзначение - nullвернуть "[object Null]".
  3. Если это значение не является ни одним из вышеперечисленных, Let Oбудет результатом вызова с toObjectпередачей thisзначения в качестве аргумента.
  4. Пусть class будет значением [[Class]]внутреннего свойства O.
  5. Возвращает строковое значение , которое является результатом конкатенации трех строк "[object ", classи "]".

Понять это на следующем примере

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

Ссылки: 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 /-агентурный срок жизни JavaScript-примитивы /

Himansh
источник
4

[object Object]- это строковое представление JavaScript по умолчанию Object. Вот что вы получите, если запустите этот код:

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

Вы можете изменить представление по умолчанию, переопределив toStringметод следующим образом:

var o = {toString: function(){ return "foo" }};
alert(o); // foo
Брайан Донован
источник
4
Это почти наверняка не то, что он хочет делать.
Lightness Races in Orbit
1
Правда, просто показываю, откуда [object Object]взялась струна.
Брайан Донован,
Вы объясняете, как изменить представление по умолчанию, а не откуда взялось исходное.
Дмитрий Зайцев
2

У вас есть объект javascript

$1и $2являются объектами jquery, возможно, используются alert($1.text());для получения текста и alert($1.attr('id');т. д.

вы должны относиться к объектам jQuery $1и $2любить их.

jondavidjohn
источник
0

Вы пытаетесь вернуть объект. Поскольку нет хорошего способа представить объект в виде строки, значение объекта .toString()автоматически устанавливается как "[object Object]".

Эрик Сюэ
источник