JavaScript数组为何同时含普通元素与键值对?ethers.getLogs结果解析
为什么ethers.getLogs()返回的结果同时包含数组元素和对象属性?
这是JavaScript特性结合ethers.js设计逻辑导致的:
数组本质是特殊对象
在JavaScript中,Array是Object的子类,因此你可以像给普通对象添加属性一样,给数组挂载自定义键值对,同时保留数组的索引式元素。你看到的结果本质就是一个数组,只是额外添加了命名属性。ethers.js的双兼容设计
这个返回值对应智能合约事件的日志数据,ethers.js这么做是为了同时支持两种访问方式:
- 按数组索引访问:对应事件ABI里参数的定义顺序(比如第0位是
userOpHash,第1位是sender),兼容习惯按位置取参的代码; - 按命名属性访问:直接通过
userOpHash、sender等键名取值,可读性更强,无需记忆参数顺序。
你自己也能在JS里造出类似结构:
const logArr = ['0xd2ab...', '0xcd63...']; logArr.userOpHash = '0xd2ab...'; logArr.sender = '0xcd63...'; console.log(logArr); // 输出会呈现数组元素+自定义属性的混合结构
这种设计是ethers.js团队为兼顾灵活性与可读性做出的权衡,同时满足不同场景的代码需求。
内容的提问来源于stack exchange,提问作者Bob Kalobsky
相关产品推荐
相关产品推荐

