

新闻资讯
行业动态JavaScript有7种原始类型(string、number、boolean、null、undefined、symbol、bigint)和1种引用类型(object),共8种;typeof无法准确判断null和多数对象,推荐用Object.prototype.toString.call()精准识别。
JavaScript 有 7 种原始(primitive)数据类型和 1 种引用(object)类型,共 8 种。准确判断变量类型不能只靠 typeof,它对 null 和多数对象都返回 "object",容易误判。
原始类型(按字面量直接创建,不可变,存于栈内存):
"hello"
42、3.14、NaN、Infinity
true、false
null(注意:typeof null === "object" 是历史 bug)123n
引用类型(对象,存于堆内存,变量存储的是引用):
typeof 多数返回 "object" 或 "function",需进一步区分这是最可靠、可扩展的通用方式,能精准识别内置对象类型:
Object.prototype.toString.call(123) → "[object Number]"
Object.prototype.toString.call([]) → "[object Array]"
Object.prototype.toString.call(null) → "[object Null]"
Object.prototype.toString.call(undefined) → "[object Undefined]"
Object.prototype.toString.call(new Date()) → "[object Date]"
Object.prototype.toString.call(/abc/) → "[object RegExp]"
可封装为工具函数:
function getType(value) {
return Object.prototype.toString.call(value).slice(8, -1);
}
// getType([]) → "Array"
// getType(Promise.resolve()) → "Promise"
快速判断原始类型(排除 null/undefined):用 typeof
typeof "abc" === "string"typeof 42 === "number"typeof function(){} === "function"(函数是对象的特例,但 typeof 单独识别)单独确认 null:用严格相等 value === null
判断数组:优先用 Array.isArray(value)(比 toString.call 更语义化、性能略优)
判断 Promise / Map / Set 等新对象:仍依赖 toString.call,因为 instanceof 在跨 iframe 场景下会失效
typeof null 返回 "object" —— 不是类型,是引擎早期 bug,已成标准,无法更改typeof NaN 返回 "number" —— 因为 NaN 是一个特殊的数值[] == false 为 true,但 [] 类型仍是 "object" —— 类型判断和值比较无关new String("a") 是对象,type
of 返回 "object";而 "a" 是原始字符串 —— 字面量与构造函数创建的类型不同