Що означає [об’єкт об’єкта]?


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
Це означає, що тип даних того, що ви повертаєте, є Об'єктом.

З інтересу: чого ви очікуєте, що він повернеться?
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/… )
Matt Ball

Загалом, я б занепокоєний тим, що об’єкти можуть не мати атрибута id; наприклад, якщо ви отримали список об'єктів просто за допомогою селектора css на зразок $ ('. someStyleClass'). Щоб зрозуміти особу будь-якого об’єкта, з яким ви маєте справу, може бути корисним або принаймні цікавим призначити метадані ваших об'єктів за допомогою функції jquery .data (), api.jquery.com/data
jsh

135

Як зазначали інші, це серіалізація об'єкта за замовчуванням. Але чому це так [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));
}


Якщо toString () не буде замінено у користувальницькому об'єкті: за документацією 15.2.4.2 Object.prototype.toString () # Ⓣ Ⓔ Ⓡ Коли виклик методу toString, виконуються наступні кроки: Якщо це значення не визначено, поверніть " [об’єкт не визначено] ". Якщо це значення є нульовим, поверніть "[об'єкт Null]". Нехай O є результатом виклику ToObject, передаючи це значення як аргумент. Нехай клас є значенням внутрішньої властивості [[Class]] O. Поверніть значення String, яке є результатом об'єднання трьох рядків "[object", class і "]".
Treefish Zhang

7
плюс один за термінологієюthingy
Джей Вік

2
Гарне пояснення! BTW, JSON.stringify не використовується тут.
тематичне поле

Чи можете ви зробити більш чітким зверху те, що ваша функція stringify, що це не так JSON.stringify, хтось може скласти неправильне враження.
Сурай Джайн

Чому Object.prototype.toString.call(undefined)дає [object Undefined]?
Сурай Джайн

21

[object Object] є типовим дляString представлення об'єкта в JavaScript.

Якщо ви хочете дізнатися про властивості вашого об'єкта, просто промовте його так:

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

У вашому конкретному випадку ви отримуєте об’єкт jQuery. Спробуйте зробити це замість цього:

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

Це повинно попередити ідентифікатор видимого елемента.


> [object Object] - це за замовчуванням toString представлення об'єкта в JavaScript. - це все ще не пояснює, звідки воно походить.
Дмитро Зайцев

11

Це значення, повернене функцією цього об'єкта toString().


Я розумію, що ви намагаєтесь зробити, тому що я відповів на ваше вчорашнє запитання про визначення того, який розділ видно :) функція повертає реальний об'єкт 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, або сказати ім'я користувача.і т.д. тощо? У своїй програмі, якщо я роблю JSON.stringify (об’єкт), я, очевидно, все бачу. Коли я намагаюся console.log (object), я отримую [Object object] ... але коли я намагаюся console.log (object.name), я отримую невизначений. (JSON.stringify (object.name) не працює; я також не
визначаюсь

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. Якщо це значення не вказане вище, Нехай Oбуде результатом виклику, який toObjectпередаєthis значення як аргументу.
  4. Нехай клас є значенням [[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 /


4

[object Object]- це рядкове представлення JavaScript за замовчуванням Object. Це ви отримаєте, якщо запустити цей код:

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

Ви можете змінити представлення за замовчуванням, замінивши такий toStringметод:

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

4
Що майже точно не те, що він хоче робити.
Гонки легкості на орбіті

1
Щоправда, просто ілюструючи, звідки [object Object]походить рядок.
Брайан Донован

Ви пояснюєте, як змінити представлення за замовчуванням, а не з оригіналу.
Дмитро Зайцев

2

У вас є об’єкт javascript

$1і $2є об'єктами jquery, можливо, використовуйте alert($1.text());для отримання тексту абоalert($1.attr('id'); тощо ...

вам належить ставитися до предметів jQuery $1і $2подобатися з ними.


0

Ви намагаєтесь повернути об’єкт. Оскільки немає хорошого способу представити об'єкт як рядок, значення об'єкта .toString()автоматично встановлюється як "[object Object]".

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.