如何让自定义类数组对象返回[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
相关产品推荐
相关产品推荐

