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

如何让自定义类数组对象返回[object Array]?能否查看Object.toString源码?

问题解答

1. 让自定义类数组对象返回[object Array]

你只需要给你的对象(或其原型)添加Symbol.toStringTag属性,将值设为'Array'即可。

Object.prototype.toString的核心逻辑是读取目标对象的Symbol.toStringTag内置符号属性,用这个值生成返回的类型标识字符串。普通对象默认没有这个属性,所以返回[object Object];而原生数组的Symbol.toStringTag就是'Array',因此能得到对应的标识。

两种实现方式:

  • 直接给单个对象添加属性
const myArrayLikeObj = {
  0: 'foo',
  1: 'bar',
  length: 2,
  push: Array.prototype.push,
  [Symbol.toStringTag]: 'Array' // 关键配置
};

console.log(Object.prototype.toString.call(myArrayLikeObj)); // 输出: [object Array]
  • 给自定义类的原型添加(批量创建对象时用)
    如果是通过类生成这类对象,把属性加在原型上更高效:
class CustomArrayLike {
  constructor(...elements) {
    elements.forEach((el, idx) => this[idx] = el);
    this.length = elements.length;
  }

  // 挂载数组方法
  push = Array.prototype.push.bind(this);
  slice = Array.prototype.slice.bind(this);
  // 其他需要的数组方法...
}

// 给原型设置Symbol.toStringTag
CustomArrayLike.prototype[Symbol.toStringTag] = 'Array';

const instance = new CustomArrayLike(1, 2, 3);
console.log(Object.prototype.toString.call(instance)); // 输出: [object Array]

2. 能否查看Object.prototype.toString的源码?

Object.prototype.toString是JavaScript引擎的内置原生方法,它的实现由C++这类底层语言编写(不同引擎实现不同,比如V8、SpiderMonkey),并非JavaScript代码,所以你找不到对应的JS层面源码。

不过各主流引擎都是开源的,你可以去它们的官方仓库查看C++层面的实现逻辑:

  • V8(Chrome、Node.js使用):仓库中能找到Object.prototype.toString的具体实现
  • SpiderMonkey(Firefox使用):其开源仓库中也有对应代码

但日常开发中,只要理解它基于Symbol.toStringTag生成标识的行为规则就足够,无需深究底层实现。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 08:30:37