Skip to content

数据类型检测的方式有哪些?

参考答案:

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"

优点

  • 语法简单,适合判断 基本类型
  • 直接内置操作符,无需额外依赖。

缺点

  • 不能区分 nullobject
  • 数组和对象都返回 "object"
  • 无法精确区分更多复杂对象(如 DateRegExp 等)。

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

优点

  • 能判断对象是否由某个构造函数创建。
  • 适合区分 ArrayDateRegExp 等引用类型。

缺点

  • 原型链判断,在跨 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]"

优点

  • 最准确、最通用的方式。
  • 可以区分各种内置对象,包括 nullundefined
  • 在跨环境中仍然可靠。

缺点

  • 语法相对冗长,不够简洁。

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

优点

  • 简单,直观。

缺点

  • nullundefined 没有 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()判断特殊值相等性精确不是专门的类型判断