项目开发中,在某个功能实现时,用对象作为对象的key,简化为下面的例子:
let a = { a: 1 } let b = {}; b[a] = "ttt"; console.log(b); let d = { q: "bbq" }; b[d] = 999; console.log("=========================="); console.log(b);
输出: qqq.png
可以看到新增的ket value会覆盖掉旧的,导致对象b永远只有一对键值,这是为什么?
======================= 分 割 线 =========================
查这个问题的时候搜到一个挺不错的文章:JavaScript系列—对象基于哈希存储(<key,value>之Key篇)
里面作者分析了对象的key在使用非字符串(比如数字)时,js默认将非字符串类型的key使用toString()方法进行类型转换,楼下几位同学的回答也说明了这点,因此上面的例子出现永远只会有一对键值,是因为对象使用toString()方法的结果只会等于’[object Object]'这个字符串值,也就是永远只有一个Key,所以不论value如何变化,只会存在一对键值,而对象转字符串,其实就是我们常用的JSON.stringify()。。。如下图。。 rrr.png
======================= 我 是 第 两 条 分 割 线 =========================
回复中提到的symbol楼主是今天才知道的。。。惭愧惭愧,查了下,确实可以,如下图: symbol.png
这篇文章对symbol的使用解释的挺不错的:理解和使用ES6中的Symbol
另外Map也是可以的, Map
感谢各位同学的回复!
@hyper-god 一楼丢了。。。不过我看到他说的了,确实正解,b的key实际上是一直是输出结果中的’[object Object]’,所以这个表现没错,同一个key,这里就变成:为什么对象不支持toString()方法,object.toString = ‘[object Object]’,js提供JSON.stringify(object)将对象转换成字符串。。。
@pretty-foam 嗯知道会默认转成字符串类型,但是不知道这里js默认的方法是toString(),而对象使用toString()只会等于‘[object Object]’