数据类型检测的方式有哪些?
参考答案:
1. typeof
ts
console.log(typeof 123); // "number"
console.log(typeof 'abc'); // "string"
console.log(typeof true); // "boolean"
console.log(typeof undefined);// "undefined"
console.log(typeof Symbol()); // "symbol"
console.log(typeof 123n); // "bigint"
console.log(typeof {}); // "object"
console.log(typeof []); // "object"
console.log(typeof null); // "object" (历史遗留问题)
console.log(typeof (()=>{}));// "function"优点:
- 语法简单,适合判断 基本类型。
- 直接内置操作符,无需额外依赖。
缺点:
- 不能区分
null和object。 - 数组和对象都返回
"object"。 - 无法精确区分更多复杂对象(如
Date、RegExp等)。
2. instanceof
ts
console.log([] instanceof Array); // true
console.log({} instanceof Object); // true
console.log(/abc/ instanceof RegExp); // true
console.log(new Date() instanceof Date); // true优点:
- 能判断对象是否由某个构造函数创建。
- 适合区分
Array、Date、RegExp等引用类型。
缺点:
- 原型链判断,在跨 iframe / 跨 realm 场景下可能失效(因为全局环境不同)。
- 对基本类型无效(如
123 instanceof Number // false)。
3. Object.prototype.toString.call()
ts
console.log(Object.prototype.toString.call(123)); // "[object Number]"
console.log(Object.prototype.toString.call('abc')); // "[object String]"
console.log(Object.prototype.toString.call(null)); // "[object Null]"
console.log(Object.prototype.toString.call(undefined));// "[object Undefined]"
console.log(Object.prototype.toString.call([])); // "[object Array]"
console.log(Object.prototype.toString.call({})); // "[object Object]"
console.log(Object.prototype.toString.call(new Date));// "[object Date]"优点:
- 最准确、最通用的方式。
- 可以区分各种内置对象,包括
null和undefined。 - 在跨环境中仍然可靠。
缺点:
- 语法相对冗长,不够简洁。
4. Array.isArray()
ts
console.log(Array.isArray([])); // true
console.log(Array.isArray({})); // false优点:
- 专门判断数组,语义清晰,推荐用来判断是否为数组。
缺点:
- 只能判断数组,功能单一。
5. constructor
ts
console.log((123).constructor === Number); // true
console.log('abc'.constructor === String); // true
console.log([].constructor === Array); // true
console.log({}.constructor === Object); // true优点:
- 简单,直观。
缺点:
null和undefined没有constructor属性,会报错。- 如果对象的
constructor被改写,结果可能不可靠。 - 跨 iframe 环境可能不准确。
6. Object.is()
虽然不是专门判断类型的方法,但在判断 值是否相等(尤其是区分 NaN、+0 和 -0)时很有用:
ts
console.log(Object.is(NaN, NaN)); // true
console.log(Object.is(+0, -0)); // false
console.log(Object.is(0, -0)); // false优点:
- 更准确的相等性比较。
缺点:
- 不是专门用于判断类型,而是辅助判断特殊值。
题目要点:
| 方法 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
typeof | 基本类型 | 简单直观 | 不能区分 null / object,数组/对象混淆 |
instanceof | 引用类型(Array, Date, RegExp) | 语义直观 | 跨 iframe 不可靠,基本类型无效 |
Object.prototype.toString.call() | 通用方式 | 最准确 | 语法繁琐 |
Array.isArray() | 判断数组 | 语义清晰 | 功能单一 |
constructor | 简单对象/数组 | 直观 | 可被篡改,null/undefined 无法用 |
Object.is() | 判断特殊值相等性 | 精确 | 不是专门的类型判断 |