项目开发中,在某个功能实现时,用对象作为对象的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);
输出:
可以看到新增的ket value会覆盖掉旧的,导致对象b永远只有一对键值,这是为什么?
======================= 分 割 线 =========================
查这个问题的时候搜到一个挺不错的文章:JavaScript系列—对象基于哈希存储(<key,value>之Key篇)
里面作者分析了对象的key在使用非字符串(比如数字)时,js默认将非字符串类型的key使用toString()方法进行类型转换,楼下几位同学的回答也说明了这点,因此上面的例子出现永远只会有一对键值,是因为对象使用toString()方法的结果只会等于’[object Object]'这个字符串值,也就是永远只有一个Key,所以不论value如何变化,只会存在一对键值,而对象转字符串,其实就是我们常用的JSON.stringify()。。。如下图。。
======================= 我 是 第 两 条 分 割 线 =========================
回复中提到的symbol楼主是今天才知道的。。。惭愧惭愧,查了下,确实可以,如下图:
这篇文章对symbol的使用解释的挺不错的:理解和使用ES6中的Symbol
另外Map也是可以的, Map
感谢各位同学的回复!
js对象 key只能是String 丶symbol类型,其他类型,默认转string类型。 这种可以考虑Map
1楼正解
@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 来用。 前者设计的目的之一就是实现后者的功能。