欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

聊一聊 JS 输出为 [object object] 是怎么回事?

程序员文章站 2023-12-25 18:26:51
聊一聊 JS 输出为 [object object] 是怎么回事? 今天在学习ES6中的 数据类型时,在写demo时控制台输出为 ,当时有点疑惑,查阅了相关资料后搞清楚了其中的原因。 在解释之前,由于有些小伙伴可能还没有接触过ES6,所以先说一下上面用到的ES6的一些特性: const: 声明一个常 ......

聊一聊 js 输出为 [object object] 是怎么回事?

今天在学习es6中的 symbol 数据类型时,在写demo时控制台输出为 symbol[object object] ,当时有点疑惑,查阅了相关资料后搞清楚了其中的原因。

在解释之前,由于有些小伙伴可能还没有接触过es6,所以先说一下上面用到的es6的一些特性:


  • const: 声明一个常量

  • symbol:js中的第7种数据类型,表示独一无二的值。symbol类型的值有symbol函数生成。

    var s1 = symbol("abc"); // 生成symbol类型的值s=symbol(abc) 这个值是独一无二的。

    var s2 = symbol("abc"); // s2 = symbol(abc)

    console.log(s1 === s2) // false, 说明这两个值是不相等的

  • 如果 symbol 的参数是一个对象,那么就会调用 tostring() 方法先将其转换为字符串。

  • 关于 symbol 更详细的介绍可以参考阮一峰老师的es6标准入门


现在上那段输出 symbol[object object] 的代码:

const obj = {
    f() {
        return "abc";
    }
};

const sym = symbol(obj);
console.log(sym); // symbol[object object]

由于 obj 是一个对象,所以会调用 tostring() 方法将其转换为字符串,对 tostring 方法不太了解的小伙伴可以查看下面mdn的解释:


  • 除了nullundefined之外,其他的类型(数值、布尔、字符串、对象)都有tostring()方法,它返回相应值的字符串表现(并不修改原变量)。
  • 每个对象都有一个tostring()方法。
  • 当该对象被表示为一个文本值时,或者一个对象以预期的字符串方式引用时自动调用。
  • 默认情况下,tostring()方法被每个object对象继承。如果此方法在自定义对象中未被覆盖,tostring()返回 "[object type]",其中type是对象的类型。

obj是我们自定义的对象,而且 tostring() 方法也没有被覆盖,所以会返回 [object object]

现在我们尝试覆盖 tostring() 方法,如下面的代码所示:

// es5写法
var obj = {
    tostring: function() {
        return "abc";
    }
};

// es6写法
const obj = {
    tostring() {
        return "abc";
    }
};

const sym = symbol(obj);
console.log(sym); // symbol(abc)

当我们覆盖掉 tostring() 方法之后,自定义对象 obj 在调用 tostring() 方法的时候调用的就是我们自定义的 tostring() 方法, 输出为 "abc" 。因此最终的结果为 symbol(abc)

完,如有不恰当之处欢迎指正哦。

上一篇:

下一篇: