聊一聊 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)
。
完,如有不恰当之处欢迎指正哦。
-------------------------------------------
个性签名:梦想不只是梦与想
如果您觉得这篇文章哪个地方不恰当甚至有错误的话,麻烦告诉一下博主哦,感激不尽。
如果您觉得这篇文章对你有一点小小的帮助的话,希望能在右下角点个“推荐”哦。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人