聊一聊 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,同样的 ...
随机推荐
- 【leetcode-152】 乘积最大子序列
给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数). 示例 1: 输入: [2,3,-2,4]输出: 6解释: 子数组 [2,3] 有最大乘积 6.示例 2: 输 ...
- C# 通过反射获取winform上的控件
比如获取Button按钮: System.Reflection.FieldInfo[] fieldInfo = form.GetType().GetFields(System.Reflection.B ...
- python 变量作用域、闭包
先看一个问题: 下面代码输出的结果是0,换句话说,这个fucn2虽然已经用global声明了variable1,但还是没有改变变量的值 def func1(): variable1=0 def fun ...
- 在redis上实现分布式锁
/** *在redis上实现分布式锁 */ class RedisLock { private $redisString; private $lockedNames = []; public func ...
- java 手写 jvm高性能缓存
java 手写 jvm高性能缓存,键值对存储,队列存储,存储超时设置 缓存接口 package com.ws.commons.cache; import java.util.function.Func ...
- getOwnPropertyDescriptor
语法 Object.getOwnPropertyDescriptor(obj, prop) 参数 obj 需要查找的目标对象 prop 目标对象内属性名称 返回值 如果指定的属性存在于对象上,则返回其 ...
- MUI下拉菜单样式
<div class="mui-input-row my_select"> <label style="width: 47px;padding-righ ...
- 递归删除文件和文件夹(bat)
递归删除当前目录下指定的文件和文件夹,使用了通配符,Win10下亲测有效,仅供参考! Batch Code 123456 @echo off echo del file... for /r % ...
- logger(三)log4j2简介及其实现原理
一.log4j2简介 log4j2是log4j 1.x和logback的改进版,据说采用了一些新技术(无锁异步.等等),使得日志的吞吐量.性能比log4j 1.x提高10倍,并解决了一些死锁的bug, ...
- Lua 字符串查找函数 string.find(s, pattern [, init [, plain]] )【转】
函数原型 string.find(s, pattern [, init [, plain]] ) s: 源字符串 pattern: 待搜索模式串 init: 可选, 起始位置 plain: 我没用过 ...