聊一聊 JS 输出为 [object object] 是怎么回事?
聊一聊 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的解释:
- 除了
null和undefined之外,其他的类型(数值、布尔、字符串、对象)都有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] 是怎么回事?的更多相关文章
- 聊一聊JS输出为[object,object]是怎么回事
JS输出为[object object] 今天在学习ES6中的 Symbol 数据类型时,在写demo时控制台输出为 Symbol[object object] ,当时有点疑惑,查阅了相关资料后搞清楚 ...
- JS输出内容为[object Object]
问题描述 项目中,欲在控制台输出变量res(自定义对象)查看数据,代码为: console.log('res:' + res); 但控制台显示结果为res: [object Object],并非想要查 ...
- JS输出为[object object]
问题描述:在控制台打印时应输出对象,但是却输出[object object] 解决办法:先将数据转换为json格式,然后再转换为json对象 JSON.parse(JSON.stringify(use ...
- [Android]通过js方法回调部分native报错 Web Console: Uncaught TypeError: Object [object Object] has no method 'xxx'
在android4.2以前,注入步骤如下: webview.getSetting().setJavaScriptEnable(true); class JsObject { public String ...
- js中[object Object]与object.prototype.toString.call()
最近在用node读取文件中的json数据后,用JSON.parse()转成了json,然后响应数据传给前端,发现输出值object对象时显示[object object],在这里我们来看一下他的具体意 ...
- 【前端】js中new和Object.create()的区别
js中new和Object.create()的区别 var Parent = function (id) { this.id = id this.classname = 'Parent' } Pare ...
- js动态参数作为Object的属性取值
js动态参数作为Object的属性取值var myObj = {"a":1,"b":2};var a = 'a';myObj[a] 就可以获取到 属性a的值了
- JS中==、===和Object.is()的区别
JS中==.===和Object.is()的区别 首先,先粗略了解一下这三个玩意儿: ==:等同,比较运算符,两边值类型不同的时候,先进行类型转换,再比较: ===:恒等,严格比较运算符,不做类型转换 ...
- 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,同样的 ...
随机推荐
- golang学习笔记----并发
并发模型 并发目前来看比较主流的就三种: 多线程:每个线程一次处理一个请求,线程越多可并发处理的请求数就越多,但是在高并发下,多线程开销会比较大. 协程:无需抢占式的调度,开销小,可以有效的提高线程的 ...
- 【linux】Too many open files 解决问题第一步【记录】
记录一下解决linux上出现:Too many open files 的第一步骤. 做个记录,免得每次都查来查去的. 1.查看 ulimit -a 2.修改 vi /etc/security/lim ...
- IdentityService4学习笔记之Authorization Code
前文 本文所有内容来自官方文档,如果有写不明白的地方请下方留言或查看官方文档. 今天介绍Authorization Code模式,适用于保密类型的客户端,保密类型客户端可以理解为在服务器端生成页面(比 ...
- windows配置flutter的注意点
参考官网配置:https://flutter.cn/docs/get-started/install/windows 注意点: 1. 配置好环境变量后,必须重启电脑才有效果(后面还有需要重启的,所以到 ...
- Java I/O系统学习系列三:I/O流的典型使用方式
尽管可以通过不同的方式组合IO流类,但我们可能也就只用到其中的几种组合.下面的例子可以作为典型的IO用法的基本参考.在这些示例中,异常处理都被简化为将异常传递给控制台,但是这只有在小型示例和工具中才适 ...
- 2019 淘友天下java面试笔试题 (含面试题解析)
本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.淘友天下等公司offer,岗位是Java后端开发,因为发展原因最终选择去了淘友天下,入职一年时间了,也成为了面 ...
- python高级编程——入门语法(一)
元类 在python中一切皆对象,类也是对象,只不过类是一个创建对象的对象,我们可以在类中动态的创建一个类,比如 def func(name): if name == "Plane" ...
- Fiddler模拟响应
1 启用规则 2 不匹配的规则通过,不勾选会导致不匹配的请求失败 3 匹配url 4 响应信息,Fiddler内置了一些响应脚步,你也可以选择一个保护响应信息的文本文件
- ORM之EF初识
之前有写过ef的codefirst,今天来更进一步认识EF! 一:EF的初步认识 ORM(Object Relational Mapping):对象关系映射,其实就是一种对数据访问的封装.主要实现流程 ...
- spring boot缓存excel临时文件后再操作
1. 引入poi的两个依赖 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi ...