聊一聊 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)

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

聊一聊 JS 输出为 [object object] 是怎么回事?的更多相关文章

  1. 聊一聊JS输出为[object,object]是怎么回事

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

  2. JS输出内容为[object Object]

    问题描述 项目中,欲在控制台输出变量res(自定义对象)查看数据,代码为: console.log('res:' + res); 但控制台显示结果为res: [object Object],并非想要查 ...

  3. JS输出为[object object]

    问题描述:在控制台打印时应输出对象,但是却输出[object object] 解决办法:先将数据转换为json格式,然后再转换为json对象 JSON.parse(JSON.stringify(use ...

  4. [Android]通过js方法回调部分native报错 Web Console: Uncaught TypeError: Object [object Object] has no method 'xxx'

    在android4.2以前,注入步骤如下: webview.getSetting().setJavaScriptEnable(true); class JsObject { public String ...

  5. js中[object Object]与object.prototype.toString.call()

    最近在用node读取文件中的json数据后,用JSON.parse()转成了json,然后响应数据传给前端,发现输出值object对象时显示[object object],在这里我们来看一下他的具体意 ...

  6. 【前端】js中new和Object.create()的区别

    js中new和Object.create()的区别 var Parent = function (id) { this.id = id this.classname = 'Parent' } Pare ...

  7. js动态参数作为Object的属性取值

    js动态参数作为Object的属性取值var myObj = {"a":1,"b":2};var a = 'a';myObj[a] 就可以获取到 属性a的值了

  8. JS中==、===和Object.is()的区别

    JS中==.===和Object.is()的区别 首先,先粗略了解一下这三个玩意儿: ==:等同,比较运算符,两边值类型不同的时候,先进行类型转换,再比较: ===:恒等,严格比较运算符,不做类型转换 ...

  9. Android webview js 调用java方法报错"Uncaught TypeError: Object [object Object] has no method xx

    webview开发,在Android4.4下js调用java方法报错"Uncaught TypeError: Object [object Object] has no method,同样的 ...

随机推荐

  1. Oracle的数据类型和表的操作

    学习笔记: Oracle数据类型 1.创建表 ---创建一个person表 create table person( pid ), pname ) ); 2.修改表结构 --添加一列 )); --修改 ...

  2. DSAPI CMD命令行进程代理

    DSAPI.文件.CMD命令行进程代理,是用来和CMD.exe或指定exe进行输出重定向的简化使用工具,可隐藏或显式地启动一个cmd.exe,并将输出流.输入流和错误流重定向至代理,通过事件触发方式与 ...

  3. Layui 时间转换时间戳

    我比较喜欢用Layui,当然也遇到一些坑!例如:绑定时间的时候是那种 是这种13位数据的日期,如果不经过转换是不能正常显示的,当然这是我遇到的问题不知道你们有没有遇到,后来我也是经过了解才知道怎么回事 ...

  4. 使用Docker之镜像的拉取、查询、删除

    1:查看镜像列表 2:拉取镜像    通过命令可以从镜像仓库中拉取镜像,默认从Docker Hub 获取. 命令格式: docker image pull <repository>:< ...

  5. Js判断flash是否被禁用,如果禁用并开启flash

    <script> function flashChecker() { ; //是否安装了flash ; //flash版本 if(document.all) { var swf = new ...

  6. log4net 写数据到sql数据库

    最近需要把用户的一些行为添加到数据库中,所以想到了用log4net ,如果有别的好的方案,大家可以给我指正. 先看一下配置文件 我这个是控制台文件 app.config <layout type ...

  7. 学习笔记之UML ( Unified Modeling Language )

    Unified Modeling Language - Wikipedia https://en.wikipedia.org/wiki/Unified_Modeling_Language The Un ...

  8. css实现图片信息展示

    <style> .layui-fluid{padding: 15px;} .img-responsive{display: block;width: 100%;max-width: 100 ...

  9. APICloud项目纪要

    一.页面之间的传递参数通过pageParam传递参数: api.openWin({ name: 'ware', url: './ware.html', pageParam: { wareId: 'w1 ...

  10. android自定义圆角实线边框,圆角虚线边框,直实线,虚实线,半圆角边框

    先上图 在现实项目开发中,单纯的Button,EditText等控件远远不能满足我们项目的UI设计需求,这时候,我们就需要自己动手丰衣足食啦.接下来先给大家介绍一些属性,备注写的都非常清楚啦,我就不啰 ...