js 中判断对象的方法
js 中判断对象的方法
typeof
typeof 运算符返回一个字符串,表示操作数的类型。
typeof 会返回以下几种结果:
- undefind
- boolean
- number
- bigint
- string
- symbol
- function
- object
使用 typeof 判断一个变量是否是对象的时候需要注意的是
typeof null === 'object' //成立这个原因是 js 语言底层设计的缺陷,在底层存储变量时使用的是二进制,使用标志为 0 表示一个变量为,null 在存储时表示为 0x00,全部为 0,但 null 并不是一个对象,在 js 中,null 是一种基本类型,表示空指针。
除此之外,其他任对象使用 typeof 都会返回 “object”
Object.prototype.toString
使用 Object.prototype.toString 方法判断一个变量是否是对象,这种方式判断的更为准确
| 名称 | typeof | Object.prototype.toString |
|---|---|---|
| Undefined | undefined | [object Undefined] |
| Null | object | [object Null] |
| Boolean | boolean | [object Boolean] |
| Number | number | [object Number] |
| String | string | [object String] |
| Symbol | symbol | [object Symbol] |
| BigInt | bigint | [object BigInt] |
| Object | object | [object Object] |
| Array | object | [object Array] |
| Function | function | [object Function] |
| ArrowFunction | function | [object Function] |
| Date | object | [object Date] |
| RegExp | object | [object RegExp] |
| Error | object | [object Error] |
| Map | object | [object Map] |
| Set | object | [object Set] |
| WeakMap | object | [object WeakMap] |
| WeakSet | object | [object WeakSet] |
| Promise | object | [object Promise] |
| Int8Array | object | [object Int8Array] |
| Uint8Array | object | [object Uint8Array] |
| Uint8ClampedArray | object | [object Uint8ClampedArray] |
| Float32Array | object | [object Float32Array] |
| Float64Array | object | [object Float64Array] |
| Math | object | [object Math] |
| JSON | object | [object JSON] |
| Arguments | object | [object Arguments] |
但是这种方法并不是一种安全的方法
Object.prototype.toString() 返回的是一个变量的描述,
在 js 中使用Symbol.toStringTag,他并不是一个底层属性,
在 js 代码中是可以访问的,也就是说可以被篡改的
const a = {
value: 1,
[Symbol.toStringTag]: 'Number',
}
Object.prototype.toString.call(a) // 这里会返回 '[object Number]'instanceof
instanceof 不能准确判断一个变量是不是对象本身,它判断的是:变量是否是某个构造函数的实例(即:构造函数的 prototype 是否在其原型链上)。
对于原始类型对原始类型返回 false,对象返回 true
但是这种方法也是不安全的,会遭到原型链污染
//原型链污染
function likeArray() {}
likeArray.prototype = Object.create(Array.prototype)
const obj2 = new likeArray()
console.log(obj2 instanceof Array) // trueconstructor
构造函数和 instanceof 类似,可以被篡改
Array.isArray()
目前最准确的和安全的判断一个变量是否是数组的方法,无法篡改
背景
「js 中判断对象的方法」属于语言语义边界主题。该类问题在重构阶段最容易引发“代码没报错但行为变了”的隐性风险。
核心原理
需要同时理解语法定义与运行时行为:作用域、提升规则、this 绑定、短路语义、类型判定边界。
实现方式 / 示例
建议每个结论都配“正例 + 反例 + 适用边界”,并明确推荐写法与禁用写法。
常见问题
- 只背结论,不验证边界。
- 在不同场景复用同一写法,忽略语义差异。
- 类型判定口径不统一时,边界对象会在不同模块产生不一致行为。
最佳实践
将知识点同步到 ESLint 规则、代码评审清单与模板代码,形成自动化约束。
总结
围绕「js 中判断对象的方法」的关键不是记忆语法,而是把语义边界沉淀为可执行规范。
