[object Object]是什么意思?

时间:2011-01-20 17:07:32

标签: javascript jquery

我正在尝试从函数中提醒返回的值,并在警报

中获取此值

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

12 个答案:

答案 0 :(得分:91)

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

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

  • 功能对象
    stringify(function (){}) - &gt; [object Function]
  • 数组对象
    stringify([]) - &gt; [object Array]
  • RegExp对象
    stringify(/x/) - &gt; [object RegExp]
  • 日期对象
    stringify(new Date) - &gt; [object Date]
  • ... several more ...
  • 对象
    stringify({}) - &gt; [object Object]

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

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

stringify应该如下所示:

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

答案 1 :(得分:39)

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

在处理jQuery对象时,您可能想要

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

打印元素的ID。

正如评论中所提到的,您应该使用Firefox或Chrome等浏览器中包含的工具,通过console.log(whichIsVisible())代替alert来反省对象。

Sidenote :ID不应以数字开头。

答案 2 :(得分:18)

[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。

答案 3 :(得分:11)

该对象的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,则它们具有内置调试程序。

答案 4 :(得分:5)

您可以在[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/

答案 5 :(得分:4)

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

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

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

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

答案 6 :(得分:4)

基础

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

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

在JavaScript中,有7种原始类型:undefinednullbooleanstringnumberbigint和{{1 }}。其他一切都是对象。基本类型symbolbooleanstring可以由它们的对象对应物包装。这些对象分别是numberBooleanString构造函数的实例。

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" 返回一个值?

因为JavaScript会很容易在基元和对象之间强制转换。在这种情况下,字符串值被强制转换为字符串对象,以便访问属性长度。字符串对象仅用了不到一秒钟的时间,之后便被献给了垃圾收集之神–但是,根据电视发现节目的精神,我们将捕获这种难以捉摸的生物并将其保存以备进一步分析……

为进一步说明这一点,请考虑以下示例,其中我们向String构造函数原型添加了一个新属性。

"this is a string".length

这意味着基元可以访问其各自的对象构造函数定义的所有属性(包括方法)。

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

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(),其他基本类型也是如此。

但是,如果不是将原始类型传递到其对应的Object构造函数的对应对象的Number.prototype.toString.call(myNumber)方法中,而是强制将原始类型作为参数传递到Object函数构造函数的toString()方法({ {1}})?

仔细研究Object.prototype.toString()

根据documentation, 调用toString方法时,将执行以下步骤:

  
      
  1. 如果toString()的值为Object.prototype.toString.call(x),则返回this
  2.   
  3. 如果undefined的值为"[object Undefined]",则返回this
  4.   
  5. 如果该值不是以上所有值,则使null为调用toObject并传递"[object Null]"值作为参数的结果。
  6.   
  7. 让class为O的{​​{1}}内部属性的值。
  8.   
  9. 返回字符串值,该值是将三个字符串this[[Class]]O串联而成的。
  10.   

从以下示例中了解这一点

"[object "

参考: 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/

答案 7 :(得分:2)

你有一个javascript对象

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

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

答案 8 :(得分:0)

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

答案 9 :(得分:0)

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

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

答案 10 :(得分:0)

请考虑以下示例:

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

哪个输出

[object bar]

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

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

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

答案 11 :(得分:0)

类为 Object 的对象似乎与通常的类实例对象有很大不同,因为它的作用就像一个关联数组或列表:它可以由简单的对象字面量(键和属性的列表)创建,如下所示:{ {1}} 并且因为它在 Developer Tools Console 窗格中显示以及转换为 JSON 字符串时看起来非常像相同的文字表示法。

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

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

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