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

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

[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】:

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

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

  • 函数对象:
    stringify(function (){}) -> [object Function]
  • 数组对象:
    stringify([]) -> [object Array]
  • 正则表达式对象
    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 值未定义,返回“[对象未定义]”。如果 this 值为 null,则返回“[object Null]”。设 O 是调用 ToObject 并将 this 值作为参数传递的结果。令 class 为 O 的 [[Class]] 内部属性的值。返回字符串值,该字符串值是连接三个字符串“[object”、class 和“]”的结果。
  • 加上thingy的术语
  • 很好的解释!顺便说一句,这里使用的不是 JSON.stringify。
  • 你能否在顶部更明确地说明你的字符串化函数是什么,它不是JSON.stringify,有人可能会产生错误的印象。
  • 为什么Object.prototype.toString.call(undefined)[object Undefined]
【解决方案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] 中看到值

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) 不起作用;我也未定义 :( )
【解决方案5】:

基本

你可能不知道,但在 JavaScript 中,每当我们与字符串、数字或布尔原语交互时,我们就进入了一个对象阴影和强制转换的隐藏世界。

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

在 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

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

所以我们看到原始类型会在需要时适当地强制转换为它们各自的 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.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. 设类为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/

【讨论】:

    【解决方案6】:

    它是该对象的 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,它们都有内置的调试器。

    【讨论】:

    • 这似乎没有回答问题。
    【解决方案7】:

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

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

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

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

    【讨论】:

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

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

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

    【讨论】:

    • console.log(JSON.stringify(whichIsVisible()));
    【解决方案9】:

    你有一个 javascript 对象

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

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

    【讨论】:

      【解决方案10】:

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

      【讨论】:

        【解决方案11】:

        考虑以下示例:

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

        哪些输出

        [object bar]
        

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

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

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

        【讨论】:

          【解决方案12】:

          类为 Object 的对象看起来与通常的类实例对象有很大不同,因为它的行为类似于关联数组或列表:它可以通过简单的对象文字(键和属性的列表)创建,如下所示:let obj={A:'a',B:'b'}; 和因为当它显示在“开发者工具控制台”窗格中以及转换为 JSON 字符串时,它看起来非常像相同的文字表示法。

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

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

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

          【讨论】:

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