【问题标题】:What does [object Object] mean?[对象对象] 是什么意思?
【发布时间】:2011-06-12 14:55:55
【问题描述】:

我试图提醒一个函数的返回值,我在提醒中得到了这个:

[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 是我要检查的功能。

【问题讨论】:

  • 这意味着你返回的数据类型是一个对象。
  • 出于兴趣:您希望它返回什么?
  • 您应该使用 JavaScript 控制台来内省您感兴趣的对象(例如 Firebug)。
  • 答案2是比较明确的答案,你能不能看一下,如果你觉得一样,就选择它作为接受的答案。

标签: javascript jquery object


【解决方案1】:

这是该对象的 toString() 函数返回的值。


我了解您要做什么,因为我回答了 your question yesterday 关于确定哪个 div 可见的问题。 :)
whichIsVisible() 函数返回一个实际的 jQuery 对象,因为我认为这会更以编程方式有用。如果你想使用这个函数进行调试,你可以这样做:

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

也就是说,如果您尝试调试问题,您确实应该使用适当的调试器而不是alert()。如果您使用的是 Firefox,Firebug 非常好。如果您使用的是 IE8、Safari 或 Chrome,它们具有内置调试器。

【讨论】:

  • 这似乎无法回答问题。
【解决方案2】:

从对象到字符串的默认转换是"[object Object]"

当您处理 jQuery 对象时,您可能想要这样做

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

打印元素的 ID。

如 cmets 中所述,您应该使用 Firefox 或 Chrome 等浏览器中包含的工具通过 console.log(whichIsVisible()) 而不是 alert 来内省对象。

旁注:ID 不应以数字开头。

【讨论】:

  • [在 HTML5 中,ID 可以以数字开头。](whatwg.org/specs/web-apps/current-work/multipage/…)
  • 更一般地说,我担心对象可能没有 id 属性;例如,如果您只使用像 $('.someStyleClass') 这样的 css 选择器得到一个对象列表。为了清楚您正在处理的任何对象的身份,使用 jquery .data() 函数分配您的对象元数据可能很有用或至少很有趣,api.jquery.com/data
【解决方案3】:

[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 表示。 -- 这仍然没有解释它的来源。
【解决方案4】:

[object Object] 是 JavaScript Object 的默认字符串表示。如果你运行这段代码,你会得到:

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

您可以通过重写toString 方法来更改默认表示,如下所示:

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

【讨论】:

  • 这几乎肯定不是他想做的。
  • 是的,只是说明了[object Object] 字符串的来源。
  • 您正在解释如何更改默认表示,而不是原始表示的来源。
【解决方案5】:

你有一个 javascript 对象

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

你必须像对待 jQuery 对象一样对待 $1$2

【讨论】:

    【解决方案6】:

    正如其他人所指出的,这是对象的默认序列化。但为什么是[object Object] 而不仅仅是[object]

    那是因为Javascript中有不同类型的对象!

    • 函数对象
      stringify(function (){}) -> [object Function]
    • 数组对象
      stringify([]) -> [object Array]
    • RegExp 对象
      stringify(/x/) -> [object RegExp]
    • 日期对象
      stringify(new Date) -> [object Date]
    • several more
    • 对象对象
      stringify({}) -> [object Object]

    那是因为构造函数被称为Object(大写“O”),而术语“对象”(小写“o”)指的是事物的结构性质。

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

    stringify 应该如下所示:

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

    【讨论】:

    • 如果 toString() 没有在自定义对象中被覆盖: per documentation 15.2.4.2 Object.prototype.toString ( ) # Ⓣ Ⓔ Ⓡ 当调用 toString 方法时,执行以下步骤:如果 this 值未定义,则返回“[object Undefined]”。如果 this 值为 null,则返回“[object Null]”。令 O 为调用 ToObject 并将 this 值作为参数传递的结果。设 class 为 O 的 [[Class]] 内部属性的值。返回 String 值,它是连接三个字符串“[object”、class 和“]”的结果。
    • 加一表示thingy的术语
    • 很好的解释!顺便说一句,这里使用的不是 JSON.stringify。
    • 您能否在顶部更明确地说明您的字符串化功能,它不是JSON.stringify,有人可能会产生错误的印象。
    • 为什么Object.prototype.toString.call(undefined)[object Undefined]
    【解决方案7】:

    你可以像这样在 [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)不起作用;我也未定义:()
    【解决方案8】:

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

    【讨论】:

      【解决方案9】:

      基础知识

      您可能不知道,但在 JavaScript 中,每当我们与字符串、数字或布尔基元交互时,我们都会进入一个隐藏的对象阴影和强制世界。

      字符串、数字、布尔值、null、未定义和符号。

      在 JavaScript 中有 7 种基本类型:undefinednullbooleanstringnumberbigintsymbol。其他一切都是对象。基本类型booleanstringnumber 可以被它们的对应对象包装。这些对象分别是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
      

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

      所以我们看到原始类型会在需要时适当地强制转换为对应的对象。

      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) 和其他原始类型类似。

      但是,如果我们不是将原始类型传递给对应的 Object 构造函数对应的 toString() 方法,而是强制将原始类型作为参数传递给 Object 函数构造函数 (Object.prototype.toString.call(x)) 的 toString() 方法,那会怎样?

      仔细看看 Object.prototype.toString()

      根据documentation, 当调用toString方法时,会采取以下步骤:

      1. 如果this 的值为undefined,则返回"[object Undefined]"
      2. 如果this 的值为null,则返回"[object Null]"
      3. 如果此值不是上述任何一个,则设O 为调用toObject 并传递this 值作为参数的结果。
      4. 让 class 为 O[[Class]] 内部属性的值。
      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/

      【讨论】:

        【解决方案10】:

        我认为最好的方法是使用JSON.stringify() 并将您的数据作为参数传递:

        alert(JSON.stringify(whichIsVisible()));
        

        【讨论】:

          【解决方案11】:

          考虑以下示例:

          const foo = {};
          foo[Symbol.toStringTag] = "bar";
          console.log("" + foo);
          

          哪些输出

          [object bar]
          

          基本上,javascript中的任何对象都可以使用标签Symbol.toStringTag定义属性并覆盖输出。

          在 javascript 原型中使用“toString”方法从某个对象构建新对象的幕后。默认对象将此方法作为属性提供,并且该方法在内部调用标记以确定如何将对象强制转换为字符串。如果标签存在,那么它会被使用,如果没有,你会得到"Object"

          你应该设置Symbol.toStringTag吗?可能是。但是对于“真正的”对象,依赖字符串始终为 [object Object] 并不是最好的主意。

          【讨论】:

            【解决方案12】:

            类为 Object 的对象似乎与通常的类实例对象完全不同,因为它就像一个关联数组或列表:它可以由简单的对象字面量(键和属性的列表)创建,如下所示:@ 987654321@ 并且因为它在“开发者工具控制台”窗格中显示以及转换为 JSON 字符串时看起来非常像这个相同的文字表示法。

            但实际上,其他类的对象(从Object派生或扩展而来)唯一真正的区别是,除了属性(即变量),其他类通常还有构造函数和方法(这些都是函数) )。使用“new”运算符分配类实例对象,并且可以通过“this”变量访问其属性和方法。您还可以使用 'prototype' 属性访问复制到每个新实例的底层静态函数,甚至可以通过向原型对象添加新函数来扩展系统类。

            Array 对象也派生自 Object 并且经常使用:它是一个有序的、索引为 0 的变量值数组。

            对象对象,与数组和其他类不同,被简单地视为关联数组(有时被认为是有序的,有时被认为是无序的)。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              相关资源
              最近更新 更多