You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么ethers.js读取智能合约返回的数据同时支持索引和点符号访问?

关于ethers.js合约返回混合结构的说明

该结构的本质

这是JavaScript原生就支持的特性,没有额外黑魔法:

  • JS中的数组本身就是特殊的对象类型,Array.isArray()返回true仅代表它符合数组的类型判定规则,不限制开发者给它追加额外的自定义键值属性。你可以用一段简单代码验证该特性:
const arr = [1,2,3]
arr.customProp = 'test'
console.log(arr[2]) // 输出3
console.log(arr.customProp) // 输出test
console.log(Array.isArray(arr)) // 输出true

你遇到的返回值就是这种追加了自定义属性的数组。

ethers.js如此设计的原因

这种结构是ethers.js专门做的兼容设计,同时满足两种开发场景的需求:

  • 如果你只知道合约返回值的顺序,不清楚参数命名,可以直接用数组下标访问返回内容
  • 如果你手上有合约ABI,知道每个返回参数的命名,就可以用可读性更高的键名(点语法)访问,不用刻意记忆返回顺序,也能避免因为顺序搞错产生的bug

你看到的「重复数据」只是两种访问入口的直观体现,实际值只存了一份,data[6]和data.voteFinished指向的是内存里的同一个值,不存在额外的空间占用。

日常使用建议

平时开发优先用键名访问即可,也可以直接解构出需要的参数简化代码:

const { id, contractAddress, voteFinished, voteAmount } = data

内容的提问来源于stack exchange,提问作者LiteralMetaphore

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 01:06:04