js对象不能以对象做key,为什么?(已解决)
发布于 3 年前 作者 SHocker-Yu 5643 次浏览 来自 问答

项目开发中,在某个功能实现时,用对象作为对象的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

感谢各位同学的回复!

10 回复

js对象 key只能是String 丶symbol类型,其他类型,默认转string类型。 这种可以考虑Map

@hyper-god 一楼丢了。。。不过我看到他说的了,确实正解,b的key实际上是一直是输出结果中的’[object Object]’,所以这个表现没错,同一个key,这里就变成:为什么对象不支持toString()方法,object.toString = ‘[object Object]’,js提供JSON.stringify(object)将对象转换成字符串。。。

@GaleLQ 真一楼hah

我去找mdn去了哈哈

@pretty-foam 嗯知道会默认转成字符串类型,但是不知道这里js默认的方法是toString(),而对象使用toString()只会等于‘[object Object]’

用 Map 或者 Symbol

@waitingsong 现在是在对象里加了个uuid属性,然后以这个uuid做key,symbol今天看你们说我才查了下才知道原来ES6还有这个。。

@SHocker-Yu 你可以把 symbol 当成 uuid 来用。 前者设计的目的之一就是实现后者的功能。

回到顶部