Object.prototype.toString.call(obj) 可可靠识别原生对象,因其返回引擎硬编码的标准类型标签(如[object Array]),而自定义对象通常返回[object Object];伪造标签无法通过 isArray、typeof 等校验,且该方法不受 iframe 隔离或 constructor 篡改影响。

用 toString 方法识别原生与非原生对象,核心在于 Object.prototype.toString.call(obj) 返回的内部类型标识(即 [object Type] 字符串)。原生构造器(如 Array、Date、RegExp、JSON 等)会返回标准且不可伪造的类型标签;而自定义对象或手动创建的对象(如 new Object()、{}、或通过 Object.create(null) 创建的)通常返回 [object Object] 或其他非标准值。
看返回值是否属于标准原生类型标签
JavaScript 规范为所有原生内置对象定义了固定的 [[Class]](ES5)或 Symbol.toStringTag(ES6+)值。调用 Object.prototype.toString.call(obj) 可安全读取该标识:
-
Object.prototype.toString.call([])→"[object Array]" -
Object.prototype.toString.call(new Date())→"[object Date]" -
Object.prototype.toString.call(JSON)→"[object JSON]"(说明是原生全局 JSON) -
Object.prototype.toString.call({})→"[object Object]"(但不等于“原生对象”,只是通用兜底) -
Object.prototype.toString.call(Object.create(null))→"[object Object]"(注意:仍返回该字符串,但实际无原型链)
区分关键:是否可被用户代码可靠复现
原生对象的类型字符串具有两个特点:由引擎硬编码、无法被普通 JS 代码完全模拟。虽然可通过 Symbol.toStringTag 伪造部分标签(如 obj[Symbol.toStringTag] = 'Array'),但以下情况仍暴露非原生本质:
- 伪造的
[object Array]不具备Array.isArray()认证 - 伪造的
[object Function]对象没有可执行性,也无法通过typeof判为"function" -
JSON、Math、Reflect等不可构造对象,其toString标签只能由引擎提供,用户无法 new 出同名实例
实用判断函数写法
一个轻量、常用的方法是预设合法原生标签列表,再比对:
function isNativeObject(obj) {
const tag = Object.prototype.toString.call(obj);
const nativeTags = [
'[object Array]', '[object Date]', '[object RegExp]',
'[object Map]', '[object Set]', '[object WeakMap]',
'[object WeakSet]', '[object Promise]', '[object Error]',
'[object Int8Array]', '[object Uint8Array]', // 其他 TypedArray
'[object JSON]', '[object Math]', '[object Reflect]'
];
return nativeTags.includes(tag);
}
注意:[object Object] 和 [object Function] 虽常见,但不直接代表“原生”——普通函数也是原生构造器 Function 的实例,一般视为原生;而纯字面量 {} 是原生 Object 实例,也属原生范畴。是否纳入需按业务定义。
为什么不用 instanceof 或 constructor?
这两个方式在跨 iframe、模块隔离或 polyfill 环境下容易失效:
-
iframe.contentWindow.Array !== Array→[] instanceof Array在父窗口为false -
obj.constructor === Object可被篡改(obj.constructor = null或重写) -
Object.prototype.toString.call()基于内部属性,不受运行时修改影响,兼容性好、稳定性高

















