JavaScript中可以使用对象作为对象的键吗?附面试代码原理求解
输出结果
456
底层逻辑说明
- JavaScript 普通对象的键仅支持字符串和Symbol两种类型,当你传入其他类型的值作为对象键时,JS 会自动调用该值的
toString()方法,将其转换为字符串后再作为键使用。 - 代码中的
b和c都是普通对象,调用toString()方法后返回的结果统一为"[object Object]",两者转换后的字符串完全一致。 - 执行
a[b] = 123时,实际是给对象a新增了一个名为"[object Object]"的属性,赋值为123;后续执行a[c] = 456时,因为c转成字符串也是"[object Object]",相当于直接覆盖了该属性的值为456。 - 最后打印
a[b]时,仍然会先把b转成"[object Object]"去a中匹配属性,最终返回的就是最后覆盖的456。
逻辑验证
你可以添加以下打印语句验证转换规则:
console.log(b.toString()) // 输出 "[object Object]" console.log(c.toString()) // 输出 "[object Object]" console.log(Object.keys(a)) // 输出 ["[object Object]"]
拓展方案
如果你有使用对象作为唯一键的需求,可以使用ES6新增的Map数据结构,Map的键支持任意类型的值,不会自动做字符串转换:
const map = new Map() const b = {key: 'b'} const c = {key: 'c'} map.set(b, 123) map.set(c, 456) console.log(map.get(b)) // 输出 123 console.log(map.get(c)) // 输出 456
内容的提问来源于stack exchange,提问作者Suleman Ahmad
相关产品推荐
相关产品推荐

