[object Object]是什么意思?


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
这意味着您返回的数据类型是一个对象。

出于兴趣:您期望它返回什么?
2011年

1
您应该使用JavaScript控制台来内省您感兴趣的对象(例如Firebug)。
Brian Donovan


答案2是更清晰的答案,您是否可以看一下,如果感觉相同,可以选择它作为可接受的答案。
Suraj Jain

Answers:


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选择器获得对象列表。为了清楚说明您正在处理的任何对象的身份,使用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”表示)表示事物的结构性质。

通常,当您谈论Javascript中的“对象”时,实际上是指对象对象 ”,而不是其他类型。

这里stringify应该是这样的:

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


如果在自定义对象中未覆盖toString():根据文档 15.2.4.2 Object.prototype.toString()#调用toString方法时,将执行以下步骤:如果未定义此值,则返回“ [对象未定义]”。如果此值为null,则返回“ [object Null]”。令O为调用ToObject并将结果值作为参数传递的结果。令class为O的[[Class]]内部属性的值。返回字符串值,该值是将三个字符串“ [object”,class和“]”串联而成的。
树鱼张

7
再加上一个术语thingy
杰伊·威克

2
很好的解释!顺便说一句,JSON.stringify不是这里使用的那个。
themefield '18

您能否在顶部使您的字符串化功能更明确,不是JSON.stringify,有人可能会给人留下错误的印象。
Suraj Jain

为什么Object.prototype.toString.call(undefined)[object Undefined]
Suraj Jain

21

[object Object] 是javascript中对象的默认toString表示形式。

如果您想知道对象的属性,只需像这样遍历它:

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表示形式。-仍然无法解释其来源。
德米特里·扎伊采夫

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,则它们具有内置调试器。


这似乎无法回答问题。
德米特里·扎伊采夫

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可以由它们的对象对应物包装。这些对象的实例BooleanStringNumber分别构造。

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

通过这种方式,原语可以访问由它们各自的对象构造函数定义的所有属性(包括方法)。

因此,我们看到了基本类型将在需要时适当地强制转换为它们各自的Object对应对象。

分析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()其对应的Object构造函数的对应方法中,而是强制将原始类型作为参数传递到toString()Object函数构造函数(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为的[[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 / 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
几乎可以肯定这不是他想要做的。
Lightness Races in Orbit

1
没错,只是说明[object Object]字符串的来源。
Brian Donovan

您正在说明如何更改默认表示,而不是原始表示的来源。
德米特里·扎伊采夫

2

您有一个javascript对象

$1并且$2是jquery对象,可能用于alert($1.text());获取文本alert($1.attr('id');等。

您必须对待$1$2喜欢jQuery对象。


0

您正在尝试返回一个对象。由于没有很好的方法将对象表示为字符串,因此该对象的.toString()值会自动设置为"[object Object]"

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.