JavaScript中是否可以声明存在同名键的Object对象
JavaScript 中是否可以声明存在重复键名的 Object 对象?
结论:标准原生普通 Object 不支持重复键名,你给出的示例写法不会生成多个同名键属性,后写的键值会直接覆盖前面的同键值。
你给出的代码实际运行效果如下:
let Obj = { '1' : '1', '1' : '1', '1' : '1', } console.log(Obj); // { '1': '1' } console.log(Object.keys(Obj).length); // 1
ECMAScript 规范明确要求,普通对象的属性键(包含字符串键、数字键、Symbol键,其中数字键会被自动转换为字符串存储)必须唯一。解析对象字面量时,只要出现重复键,引擎会直接保留最后一次声明的键值对,前面的同键条目会被直接丢弃,不存在任何兼容标准的语法能让普通Object存储多个同名属性。
如果你的业务场景确实需要存储重复键的键值对,可以用以下两种可行方案替代:
- 用键值对元组数组存储,完全支持重复键,可严格保留插入顺序
// 每个元素为 [键, 值] 结构的数组 const pairList = [ ['1', '第一个值'], ['1', '第二个值'], ['1', '第三个值'] ] // 取出键为'1'的所有值 const allValuesOfKey1 = pairList.filter(([key]) => key === '1').map(([, value]) => value) console.log(allValuesOfKey1); // ['第一个值', '第二个值', '第三个值']
- 如果需要保留对象按键快速访问的特性,可以将单个键的对应值初始化为数组,同键的多个值都存在数组中
const multiValueObj = {} // 封装追加值的方法,避免直接赋值覆盖 function setItem(obj, key, value) { if (!Array.isArray(obj[key])) { obj[key] = [] } obj[key].push(value) } setItem(multiValueObj, '1', '1') setItem(multiValueObj, '1', '2') setItem(multiValueObj, '1', '3') console.log(multiValueObj['1']); // ['1', '2', '3']
内容的提问来源于stack exchange,提问作者Hamed
相关产品推荐
相关产品推荐

