[オブジェクトオブジェクト]の意味?


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、2011年

1
JavaScriptコンソールを使用して、関心のあるオブジェクト(Firebugなど)をイントロスペクトする必要があります。
ブライアンドノバン


回答2はより明確な回答です。それを見て、同じと思われる場合は、受け入れられた回答として選択してください。
Suraj Jain

回答:


53

オブジェクトから文字列へのデフォルトの変換は"[object Object]"です。

jQueryオブジェクトを扱っているので、

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

要素のIDを出力します。

コメントで述べたように、FirefoxやChromeなどのブラウザに含まれているツールを使用して、のconsole.log(whichIsVisible())代わりにオブジェクトをイントロスペクトする必要がありalertます。

補足:IDは数字で始めないでください。


3
[においてHTML5、IDは数字で開始することができる。(whatwg.org/specs/web-apps/current-work/multipage/...
マット・ボール

より一般的には、オブジェクトがid属性を持たない可能性があることを心配します。たとえば、$( '。someStyleClass')のようなcssセレクターだけを使用してオブジェクトリストを取得したとします。処理しているオブジェクトのIDを明確にするために、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(大文字の「O」で)呼び出され、「オブジェクト」という用語(「o」が小さい)がThingの構造的な性質を参照しているためです。

通常、Javascriptで「オブジェクト」について話しているときは、実際にオブジェクトオブジェクト」を意味し、他のタイプを意味するわけではありません。

次のstringifyようになります。

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


カスタムオブジェクトでtoString()がオーバーライドされていない場合:ドキュメントごと15.2.4.2 Object.prototype.toString()#ⓉⒺⓇtoStringメソッドが呼び出されると、次の手順が実行されます。この値が未定義の場合は、「 [オブジェクト未定義]」。この値がnullの場合、「[object Null]」を返します。この値を引数として渡してToObjectを呼び出した結果をOとします。classをOの[[Class]]内部プロパティの値とします。3つの文字列「[object」、class、および「]」を連結した結果である文字列値を返します。
Treefish Zhang 2017

7
プラス1の用語thingy
ジェイウィック2018年

2
いい説明だ!ところで、JSON.stringifyはここでは使用されません。
テーマフィールド

あなたの文字列化機能は、それがないことを何上部にあることがより明確にすることができJSON.stringify、誰かが間違った印象を取ることができます。
Suraj Jain

なぜObject.prototype.toString.call(undefined)与えるの[object Undefined]ですか?
Suraj Jain

21

[object Object] JavaScriptでのオブジェクトのデフォルトのtoString表現です。

オブジェクトのプロパティを知りたい場合は、次のようにforeachしてください:

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

特定のケースでは、jQueryオブジェクトを取得しています。代わりにこれを試してください:

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

これにより、可視要素のIDが警告されます。


> [object Object]は、JavaScriptでのオブジェクトのデフォルトのtoString表現です。-これはまだそれがどこから来たかを説明していません。
Dmitri Zaitsev

11

これは、そのオブジェクトのtoString()関数によって返される値です。


昨日、表示されているdivの特定についての質問にお答えしたので、あなたが何をしようとしているのか理解しました。:)
このwhichIsVisible()関数は実際のjQueryオブジェクトを返します。これは、プログラム的に役立つと考えたためです。この関数をデバッグの目的で使用する場合は、次のようにすることができます。

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

つまり、問題をデバッグしようとしているのではなく、実際には適切なデバッガを使用する必要がありますalert()。Firefoxを使用している場合は、Firebugが最適です。IE8、Safari、またはChromeを使用している場合、組み込みのデバッガーがあります。


これは質問に答えていないようです。
Dmitri Zaitsev

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 object] ...が表示されますが、console.log(object.name)を試行すると、未定義になります。(JSON.stringify(object.name)が機能しません。私も未定義になります:()
daCoda

8

基本

ご存じないかもしれませんが、JavaScriptでは、文字列、数値、ブールプリミティブを操作するたびに、オブジェクトのシャドウと強制の隠された世界に入ります。

文字列、数値、ブール、null、未定義、およびシンボル。

JavaScriptでは7つのプリミティブ型があります:undefinednullbooleanstringnumberbigintsymbol。それ以外はすべてオブジェクトです。プリミティブ型booleanstringおよび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.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呼び出した結果になります。toObjectthis
  4. classをの[[Class]]内部プロパティの値としますO
  5. 3つの文字列を連結した結果であるString値を返します"[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 / the-secret-life-of-javascript-primitives /


4

[object Object]JavaScriptのデフォルトの文字列表現ですObject。このコードを実行すると、次のようになります。

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

次のtoStringようにメソッドをオーバーライドすることで、デフォルトの表現を変更できます。

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

4
それはほぼ間違いなく彼がしたいことではありません。
オービットの軽量レース、

1
確かに、[object Object]文字列がどこから来たかを示すだけです。
ブライアンドノヴァン

元の表現がどこから来たのかではなく、デフォルトの表現を変更する方法を説明しています。
Dmitri Zaitsev

2

あなたはJavaScriptオブジェクトを持っています

$1そして$2jqueryオブジェクトであり、おそらくalert($1.text());テキストalert($1.attr('id');などを取得するために使用します...

jQueryオブジェクトを扱い$1$2好きにする必要があります。


0

オブジェクトを返そうとしています。オブジェクトを文字列として表す適切な方法がないため、オブジェクトの.toString()値は自動的にに設定され"[object Object]"ます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.