Apa artinya [Objek Objek]?

122

Saya mencoba memberi tahu nilai yang dikembalikan dari suatu fungsi dan saya mendapatkan ini di peringatan:

[object Object]  

Ini kode JavaScript-nya:

<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 adalah fungsi yang saya coba periksa.

Prady
sumber
3
Artinya tipe data dari apa yang Anda kembalikan adalah Objek.
Di luar minat: apa yang Anda harapkan untuk dikembalikan?
Dancrumb
1
Anda harus menggunakan konsol JavaScript untuk introspeksi objek yang Anda minati (mis. Firebug).
Brian Donovan
Jawaban 2 adalah jawaban yang lebih jelas, dapatkah Anda melihatnya, dan memilihnya sebagai jawaban yang diterima jika Anda merasakan hal yang sama.
Suraj Jain

Jawaban:

53

Konversi default dari objek menjadi string adalah "[object Object]".

Saat Anda berurusan dengan objek jQuery, Anda mungkin ingin melakukannya

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

untuk mencetak ID elemen.

Seperti yang disebutkan dalam komentar, Anda harus menggunakan alat yang disertakan dalam browser seperti Firefox atau Chrome untuk melakukan introspeksi objek dengan melakukan console.log(whichIsVisible())daripada alert.

Catatan samping : ID tidak boleh dimulai dengan angka.

Felix Kling
sumber
3
[Dalam HTML5, ID dapat dimulai dengan angka.] ( Whatwg.org/specs/web-apps/current-work/multipage/… )
Matt Ball
Secara lebih umum, saya akan khawatir bahwa objek mungkin tidak MEMILIKI atribut id; misalnya, jika Anda mendapatkan daftar objek hanya menggunakan pemilih css seperti $ ('. someStyleClass'). Untuk memperjelas identitas objek apa pun yang Anda hadapi, mungkin berguna atau setidaknya menarik untuk menetapkan metadata objek Anda menggunakan fungsi jquery .data (), api.jquery.com/data
jsh
136

Seperti yang telah dicatat orang lain, ini adalah serialisasi default dari suatu objek. Tetapi mengapa demikian [object Object]dan tidak adil [object]?

Itu karena ada berbagai jenis objek di Javascript!

  • Objek fungsi :
    stringify(function (){})->[object Function]
  • Objek array :
    stringify([])->[object Array]
  • Objek RegExp
    stringify(/x/) ->[object RegExp]
  • Objek tanggal
    stringify(new Date) ->[object Date]
  • Beberapa lagi
  • dan Objek objek !
    stringify({})->[object Object]

Itu karena fungsi konstruktor disebut Object(dengan huruf besar "O"), dan istilah "objek" (dengan "o" kecil) mengacu pada sifat struktural benda tersebut.

Biasanya, saat Anda berbicara tentang "objek" di Javascript, yang Anda maksud adalah " Objek objek ", dan bukan jenis lainnya.

dimana stringifyseharusnya terlihat seperti ini:

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

pengguna123444555621
sumber
Jika toString () tidak diganti dalam objek kustom: per dokumentasi 15.2.4.2 Object.prototype.toString () # Ⓣ Ⓔ Ⓡ Saat metode toString dipanggil, langkah-langkah berikut diambil: Jika nilai ini tidak ditentukan, kembalikan " [object Undefined] ". Jika nilai ini null, kembalikan "[object Null]". Misalkan O adalah hasil dari pemanggilan ToObject yang meneruskan nilai ini sebagai argumen. Biarkan kelas menjadi nilai properti internal [[Kelas]] dari O. Kembalikan nilai String yang merupakan hasil penggabungan tiga String "[objek", kelas, dan "]".
Treefish Zhang
7
ditambah satu untuk terminologithingy
Jay Wick
2
Penjelasan yang bagus! BTW, JSON.stringify bukan yang digunakan di sini.
themefield
Bisakah Anda membuatnya lebih eksplisit di bagian atas apa fungsi stringify Anda, bahwa tidak JSON.stringify, seseorang dapat mengambil kesan yang salah.
Suraj Jain
Mengapa Object.prototype.toString.call(undefined)memberi [object Undefined]?
Suraj Jain
21

[object Object] adalah representasi toString default dari suatu objek dalam javascript.

Jika Anda ingin mengetahui properti objek Anda, teruskan saja seperti ini:

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

Dalam kasus khusus Anda, Anda mendapatkan objek jQuery. Coba lakukan ini sebagai gantinya:

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

Ini harus mengingatkan id dari elemen yang terlihat.

alexn
sumber
> [Objek Objek] adalah representasi toString default dari sebuah objek dalam javascript. - ini masih belum menjelaskan dari mana asalnya.
Dmitri Zaitsev
11

Ini adalah nilai yang dikembalikan oleh toString()fungsi objek itu .


Saya mengerti apa yang Anda coba lakukan, karena saya menjawab pertanyaan Anda kemarin tentang menentukan div mana yang terlihat. :)
The whichIsVisible()fungsi mengembalikan sebuah objek jQuery yang sebenarnya, karena saya pikir itu akan menjadi lebih pemrograman berguna. Jika Anda ingin menggunakan fungsi ini untuk tujuan debugging, Anda bisa melakukan sesuatu seperti ini:

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

Karena itu, Anda benar-benar harus menggunakan debugger yang tepat daripada alert()jika Anda mencoba men-debug masalah. Jika Anda menggunakan Firefox, Firebug sangat bagus. Jika Anda menggunakan IE8, Safari, atau Chrome, mereka memiliki debugger bawaan.

Matt Ball
sumber
Ini sepertinya tidak menjawab pertanyaan itu.
Dmitri Zaitsev
9

Anda dapat melihat nilai di dalam [Objek Objek] seperti ini

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

Coba seperti ini

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

referensi

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

Ryosuke Hujisawa
sumber
Bagaimana Anda mengakses misalnya, userDate.timezone, atau mengatakan user.name dll.? Dalam program saya, jika saya melakukan JSON.stringify (object), jelas saya bisa melihat semuanya. Ketika saya mencoba console.log (object), saya mendapatkan [Object object] ... tetapi ketika saya mencoba console.log (object.name), saya mendapatkan undefined. (JSON.stringify (object.name) tidak berfungsi; Saya juga tidak terdefinisi :()
daCoda
9

Dasar-dasar

Anda mungkin tidak mengetahuinya tetapi, dalam JavaScript, setiap kali kita berinteraksi dengan string, angka, atau boolean primitif, kita memasuki dunia tersembunyi dari bayangan dan pemaksaan objek.

string, number, boolean, null, undefined, dan simbol.

Dalam JavaScript ada 7 tipe primitif: undefined, null, boolean, string, number, bigintdan symbol. Segala sesuatu yang lain adalah sebuah objek. Tipe primitif boolean, stringdan numberbisa dibungkus oleh rekan objeknya. Objek-objek ini masing-masing adalah instance dari Boolean, Stringdan Numberkonstruktor.

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"

Jika primitif tidak memiliki properti, mengapa "this is a string".lengthmengembalikan nilai?

Karena JavaScript akan dengan mudah memaksa antara primitif dan objek. Dalam hal ini nilai string dipaksa ke objek string untuk mengakses panjang properti. Objek string hanya digunakan sepersekian detik setelah itu dikorbankan untuk Dewa pengumpulan sampah - tetapi dalam semangat acara penemuan TV, kami akan menjebak makhluk yang sulit dipahami dan melestarikannya untuk analisis lebih lanjut ...

Untuk mendemonstrasikan hal ini lebih lanjut pertimbangkan contoh berikut di mana kita menambahkan properti baru ke prototipe konstruktor String.

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

Dengan cara ini, primitif memiliki akses ke semua properti (termasuk metode) yang ditentukan oleh konstruktor objeknya masing-masing.

Jadi kita melihat bahwa tipe primitif akan dengan tepat memaksa ke rekan Object masing-masing saat diperlukan.

Analisis toString()metode

Perhatikan kode berikut

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"

Seperti dibahas di atas, apa yang sebenarnya terjadi adalah ketika kita memanggil toString()metode pada tipe primitif, itu harus dipaksakan ke pasangan objeknya sebelum bisa memanggil metode.
yaitu myNumber.toString()setara dengan Number.prototype.toString.call(myNumber)dan serupa untuk tipe primitif lainnya.

Tetapi bagaimana jika alih-alih tipe primitif yang diteruskan ke toString()metode mitra fungsi konstruktor Objek yang sesuai, kita memaksa tipe primitif untuk diteruskan sebagai parameter ke toString()metode konstruktor fungsi Objek ( Object.prototype.toString.call(x))?

Melihat lebih dekat ke Object.prototype.toString ()

Sesuai dokumentasi , Ketika metode toString dipanggil, langkah-langkah berikut diambil:

  1. Jika thisnilainya adalah undefined, kembalikan "[object Undefined]".
  2. Jika thisnilainya adalah null, kembalikan "[object Null]".
  3. Jika nilai ini tidak ada di atas, Membiarkan Omenjadi hasil dari panggilan toObjectmelewati thisnilai sebagai argumen.
  4. Biarkan kelas menjadi nilai [[Class]]properti internal O.
  5. Mengembalikan nilai String yang merupakan hasil dari concatenating tiga Strings "[object ", classdan "]".

Pahami ini dari contoh berikut

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

Referensi: 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-primitives /

Himansh
sumber
4

[object Object]adalah representasi string default dari JavaScript Object. Inilah yang akan Anda dapatkan jika Anda menjalankan kode ini:

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

Anda dapat mengubah representasi default dengan mengganti toStringmetode seperti ini:

var o = {toString: function(){ return "foo" }};
alert(o); // foo
Brian Donovan
sumber
4
Yang hampir pasti bukan yang dia ingin lakukan.
Balapan Ringan di Orbit
1
Benar, hanya menggambarkan dari mana [object Object]string itu berasal.
Brian Donovan
Anda sedang menjelaskan cara mengubah representasi default, bukan dari mana asal aslinya.
Dmitri Zaitsev
2

Anda memiliki objek javascript

$1dan $2merupakan objek jquery, mungkin digunakan alert($1.text());untuk mendapatkan teks atau alert($1.attr('id');dll ...

Anda harus memperlakukan $1dan $2menyukai objek jQuery.

jondavidjohn
sumber
0

Anda mencoba mengembalikan suatu objek. Karena tidak ada cara yang baik untuk merepresentasikan objek sebagai string, nilai objek .toString()secara otomatis ditetapkan sebagai "[object Object]".

Eric Xue
sumber