[Nesne Nesne] ne anlama geliyor?


122

Bir işlevden döndürülen bir değeri uyarmaya çalışıyorum ve bunu uyarıda görüyorum:

[object Object]  

İşte JavaScript kodu:

<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 kontrol etmeye çalıştığım işlev.


3
Bu, döndürdüğünüz şeyin veri türünün bir Nesne olduğu anlamına gelir.

İlgi dışı: Neye dönmesini bekliyorsunuz?
Dancrumb

1
İlgilendiğiniz nesnelerin içini incelemek için bir JavaScript konsolu kullanmalısınız (örn. Firebug).
Brian Donovan


Cevap 2 daha net cevaptır, ona bir göz atabilir ve aynı hissediyorsanız kabul edilmiş cevap olarak seçebilir misiniz?
Suraj Jain

Yanıtlar:


53

Bir nesneden dizgeye varsayılan dönüştürme "[object Object]".

JQuery nesneleriyle uğraşırken, yapmak isteyebilirsiniz

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

öğenin kimliğini yazdırmak için.

Yorumlarda da belirtildiği gibi, Firefox veya Chrome gibi tarayıcılarda bulunan araçları console.log(whichIsVisible())yerine yaparak nesnelerin içini incelemek için kullanmalısınız alert.

Ek not: Kimlikler rakamlarla başlamamalıdır.


3
[HTML5'te, kimlikler rakamlarla başlayabilir.] ( Whatwg.org/specs/web-apps/current-work/multipage/… )
Matt Ball

Daha genel olarak, nesnelerin bir id özniteliğine sahip olamayacağından endişe ediyorum; örneğin, yalnızca $ ('. someStyleClass') gibi bir css seçici kullanan bir nesne listeniz varsa. İlgilendiğiniz nesnenin kimliği konusunda net olmak için, jquery .data () işlevini kullanarak nesnelerinizin meta verilerini atamak yararlı veya en azından ilginç olabilir, api.jquery.com/data
jsh

136

Diğerlerinin de belirttiği gibi, bu bir nesnenin varsayılan serileştirmesidir. Ama neden [object Object]sadece değil [object]?

Bunun nedeni, Javascript'te farklı nesne türleri olmasıdır!

  • Fonksiyon nesneleri :
    stringify(function (){})->[object Function]
  • Dizi nesneleri :
    stringify([])->[object Array]
  • RegExp nesneleri
    stringify(/x/) ->[object RegExp]
  • Tarih nesneleri
    stringify(new Date) ->[object Date]
  • Birkaç tane daha
  • ve Nesne nesneleri !
    stringify({})->[object Object]

Bunun nedeni, yapıcı işlevin çağrılmasıdır Object(büyük "O" ile) ve "nesne" terimi (küçük "o" ile) şeyin yapısal doğasını ifade eder.

Genellikle, JavaScript "nesneler", aslında bahsederken ortalama " Nesne nesneleri " değil, diğer türleri.

nereye stringifyböyle görünmeli:

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


ToString () özel bir nesnede geçersiz kılınmamışsa: belge başına 15.2.4.2 Object.prototype.toString () # Ⓣ Ⓔ Ⓡ toString yöntemi çağrıldığında, aşağıdaki adımlar uygulanır: Bu değer tanımsız ise, geri dön " [nesne Tanımsız] ". Bu değer null ise, "[nesne Null]" döndür. Bu değeri bağımsız değişken olarak ileten ToObject çağrısının sonucu O olsun. Sınıf, O'nun [[Sınıf]] dahili özelliğinin değeri olsun. Üç Dizeyi "[nesne", sınıf ve "]" birleştirmenin sonucu olan Dize değerini döndürür.
Treefish Zhang

7
artı terminoloji için bir tanethingy
Jay Wick

2
İyi açıklama! BTW, JSON.stringify burada kullanılan değil.
themefield

En üstte, stringify fonksiyonunuzun ne olmadığını daha açık hale getirebilir misiniz JSON.stringify?
Suraj Jain

Neden Object.prototype.toString.call(undefined)verir [object Undefined]?
Suraj Jain

21

[object Object] javascript'te bir nesnenin varsayılan toString gösterimidir.

Nesnenizin özelliklerini bilmek istiyorsanız, sadece şu şekilde üzerine gelin:

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

Sizin özel durumunuzda, bir jQuery nesnesi alıyorsunuz. Bunun yerine şunu yapmayı deneyin:

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

Bu, görünür öğenin kimliğini uyarmalıdır.


> [nesne Nesne], bir nesnenin javascript'teki varsayılan toString gösterimidir. - bu hala nereden geldiğini açıklamıyor.
Dmitri Zaitsev

11

Bu nesnenin toString()işlevi tarafından döndürülen değerdir .


Ne yapmaya çalıştığınızı anlıyorum, çünkü dün hangi div'in görünür olduğunu belirleme konusundaki sorunuza cevap verdim . :) O fazla olacağını düşündüğü için bir fonksiyon, gerçek jQuery nesnesi geri programlı yararlıdır. Bu işlevi hata ayıklama amacıyla kullanmak istiyorsanız, bunun gibi bir şey yapabilirsiniz:
whichIsVisible()

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

Bununla birlikte, bir problemin hatalarını gidermeye çalışmak yerine gerçekten uygun bir hata ayıklayıcı kullanmalısınızalert() . Firefox kullanıyorsanız, Firebug mükemmeldir. IE8, Safari veya Chrome kullanıyorsanız, yerleşik hata ayıklayıcıları vardır.


Bu soruyu yanıtlamıyor.
Dmitri Zaitsev

9

[Object Object] içindeki değeri şöyle görebilirsiniz

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

Böyle dene

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

referans

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


Örneğin userDate.timezone'a nasıl erişirsiniz veya user.name vb. Programımda JSON.stringify (nesne) yaparsam, tabii ki her şeyi görebilirim. Console.log (nesne) 'yi denediğimde, [Nesne nesnesi] alıyorum ... ama console.log (nesne.adı)' yı denediğimde, tanımsız kalıyorum. (JSON.stringify (object.name) çalışmıyor; Ben de tanımsız
kalıyorum

9

temeller

Bunu bilmiyor olabilirsiniz, ancak JavaScript'te dize, sayı veya mantıksal ilkellerle her etkileşime girdiğimizde, nesne gölgeleri ve zorlamadan oluşan gizli bir dünyaya giriyoruz.

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

JavaScript'inizde 7 ilkel tipi vardır: undefined, null, boolean, string, number, bigintve symbol. Diğer her şey bir nesnedir. İlkel türleri boolean, stringve numberbunların nesne muadilleri tarafından sarılabilir. Bu nesneler, sırasıyla Boolean, Stringve Numberyapıcılarının örnekleridir .

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"

İlkellerin özelliği yoksa, neden "this is a string".lengthbir değer döndürür?

Çünkü JavaScript, ilkel öğeler ve nesneler arasında kolayca zorlanır. Bu durumda, özellik uzunluğuna erişmek için dize değeri bir dizge nesnesine zorlanır. İp nesnesi yalnızca bir saniyeden kısa bir süre için kullanılır ve ardından çöp toplama tanrılarına feda edilir - ancak TV keşif programlarının ruhuna uygun olarak, yakalanması zor yaratığı yakalayıp daha fazla analiz için koruyacağız ...

Bunu daha fazla göstermek için String yapıcı prototipine yeni bir özellik eklediğimiz aşağıdaki örneği göz önünde bulundurun.

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

Bu yolla, ilkellerin ilgili nesne yapıcıları tarafından tanımlanan tüm özelliklere (yöntemler dahil) erişimi vardır.

Böylece, ilkel türlerin gerektiğinde ilgili Nesne muadillerine uygun şekilde zorlayacağını gördük.

toString()Yöntemin analizi

Aşağıdaki kodu düşünün

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"

Yukarıda tartışıldığı gibi, gerçekte olan şey, toString()yöntemi ilkel tipte çağırdığımızda, yöntemi çağırmadan önce nesnenin karşılığına zorlanması gerektiğidir.
ie myNumber.toString(), Number.prototype.toString.call(myNumber)diğer ilkel türlere eşdeğer ve benzerdir.

Ancak, ilkel türün toString()karşılık gelen Object yapıcı işlevi karşılığının yöntemine geçirilmesi yerine, ilkel türün toString()Object function constructor ( Object.prototype.toString.call(x)) yöntemine parametre olarak aktarılmasını zorlarsak ?

Object.prototype.toString () öğesine daha yakından bakın

Uyarınca belgeleri toString yöntemi çağrıldığında, aşağıdaki adımlar gerçekleştirilir:

  1. Eğer thisdeğerdir undefined, dönmek "[object Undefined]".
  2. Eğer thisdeğerdir null, dönmek "[object Null]".
  3. Bu değer yukarıdakilerden hiçbiri değilse , değeri argüman olarak geçirmenin Osonucu olsun .toObjectthis
  4. Sınıfın [[Class]]dahili özelliğinin değeri olsun O.
  5. Üç Dizeleri bitiştirme sonucudur dize değerini döndürür "[object ", classve "]".

Bunu aşağıdaki örnekten anlayın

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

Referanslar: 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 / gizli-life-of-javascript-ilkel /


4

[object Object]bir JavaScript'in varsayılan dize gösterimidir Object. Bu kodu çalıştırırsanız elde edeceğiniz şey budur:

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

toStringYöntemi geçersiz kılarak varsayılan gösterimi şu şekilde değiştirebilirsiniz :

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

4
Bu neredeyse kesinlikle yapmak istediği şey değil.
Orbit'te Hafiflik Yarışları

1
Doğru, sadece [object Object]dizenin nereden geldiğini gösteriyorum.
Brian Donovan

Orijinal olanın nereden geldiğini değil, varsayılan gösterimi nasıl değiştireceğinizi açıklıyorsunuz.
Dmitri Zaitsev

2

Bir javascript nesneniz var

$1ve $2jquery nesneleridir. alert($1.text());Metin almak için kullanabilir veyaalert($1.attr('id'); vb. ...

Eğer tedavi gereken $1ve $2jQuery nesneler gibi.


0

Bir nesneyi iade etmeye çalışıyorsunuz. Bir nesneyi bir dizge olarak göstermenin iyi bir yolu olmadığından, nesnenin .toString()değeri otomatik olarak olarak ayarlanır "[object Object]".

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.