问答题1075/1658数据类型检测的方式有哪些?

难度:
2021-08-22 创建

参考答案:

1. typeof

1console.log(typeof 123); // "number" 2console.log(typeof 'abc'); // "string" 3console.log(typeof true); // "boolean" 4console.log(typeof undefined);// "undefined" 5console.log(typeof Symbol()); // "symbol" 6console.log(typeof 123n); // "bigint" 7console.log(typeof {}); // "object" 8console.log(typeof []); // "object" 9console.log(typeof null); // "object" (历史遗留问题) 10console.log(typeof (()=>{}));// "function"

优点

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

缺点

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

2. instanceof

1console.log([] instanceof Array); // true 2console.log({} instanceof Object); // true 3console.log(/abc/ instanceof RegExp); // true 4console.log(new Date() instanceof Date); // true

优点

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

缺点

  • 原型链判断,在跨 iframe / 跨 realm 场景下可能失效(因为全局环境不同)。
  • 对基本类型无效(如 123 instanceof Number // false)。

3. Object.prototype.toString.call()

1console.log(Object.prototype.toString.call(123)); // "[object Number]" 2console.log(Object.prototype.toString.call('abc')); // "[object String]" 3console.log(Object.prototype.toString.call(null)); // "[object Null]" 4console.log(Object.prototype.toString.call(undefined));// "[object Undefined]" 5console.log(Object.prototype.toString.call([])); // "[object Array]" 6console.log(Object.prototype.toString.call({})); // "[object Object]" 7console.log(Object.prototype.toString.call(new Date));// "[object Date]"

优点

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

缺点

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

4. Array.isArray()

1console.log(Array.isArray([])); // true 2console.log(Array.isArray({})); // false

优点

  • 专门判断数组,语义清晰,推荐用来判断是否为数组。

缺点

  • 只能判断数组,功能单一。

5. constructor

1console.log((123).constructor === Number); // true 2console.log('abc'.constructor === String); // true 3console.log([].constructor === Array); // true 4console.log({}.constructor === Object); // true

优点

  • 简单,直观。

缺点

  • nullundefined 没有 constructor 属性,会报错。
  • 如果对象的 constructor 被改写,结果可能不可靠。
  • 跨 iframe 环境可能不准确。

6. Object.is()

虽然不是专门判断类型的方法,但在判断 值是否相等(尤其是区分 NaN+0-0)时很有用:

1console.log(Object.is(NaN, NaN)); // true 2console.log(Object.is(+0, -0)); // false 3console.log(Object.is(0, -0)); // false

优点

  • 更准确的相等性比较。

缺点

  • 不是专门用于判断类型,而是辅助判断特殊值。

最近更新时间:2025-08-21

赞赏支持

题库维护不易,您的支持就是我们最大的动力!