判断数据类型的方法

49 阅读2分钟

1、typeof

特点

  • 返回一个字符串,表示操作数的数据类型。
  • 可以识别基本类型(如 numberstringbooleanundefinedsymbol)。
  • 对于 null 和引用类型(如 objectarrayfunction),识别能力有限。 返回值
类型返回值
number"number"
string"string"
boolean"boolean"
undefined"undefined"
symbol"symbol"
null"object"
object"object"
array"object"
function"function"

示例

console.log(typeof 42); // "number"
console.log(typeof "hello"); // "string"
console.log(typeof true); // "boolean"
console.log(typeof undefined); // "undefined"
console.log(typeof Symbol()); // "symbol"
console.log(typeof null); // "object" (历史遗留问题)
console.log(typeof {}); // "object"
console.log(typeof []); // "object"
console.log(typeof function() {}); // "function"

instanceof

特点:

  • 用于检查对象是否是某个构造函数的实例。
  • 适用于判断引用类型(如 objectarrayfunction)。
  • 不能用于判断基本类型。

示例

console.log([] instanceof Array); // true
console.log({} instanceof Object); // true
console.log(function() {} instanceof Function); // true
console.log("hello" instanceof String); // false (基本类型不适用)

Object.prototype.toString

特点

  • 返回一个表示对象的字符串,格式为 [object Type]
  • 可以准确判断所有数据类型,包括基本类型和引用类型。

示例

console.log(Object.prototype.toString.call(42)); // "[object Number]"
console.log(Object.prototype.toString.call("hello")); // "[object String]"
console.log(Object.prototype.toString.call(true)); // "[object Boolean]"
console.log(Object.prototype.toString.call(undefined)); // "[object Undefined]"
console.log(Object.prototype.toString.call(null)); // "[object Null]"
console.log(Object.prototype.toString.call({})); // "[object Object]"
console.log(Object.prototype.toString.call([])); // "[object Array]"
console.log(Object.prototype.toString.call(function() {})); // "[object Function]"

Array.isArray

特点:

  • 专门用于判断一个值是否为数组。
  • 比 instanceof 更可靠,适用于跨框架(iframe)的场景。

示例

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

===!==

特点

  • 用于严格比较值和类型。
  • 常用于判断 null 和 undefined

示例

let value = null;
console.log(value === null); // true
console.log(value === undefined); // false

综合判断的方法

 function getType(data){
    if(typeof data !== "object"){
      return typeof data
    }
    return Object.prototype.toString.call(data).slice(8,-1)
  }

  // 测试
console.log(getType(42)); // "number"
console.log(getType("hello")); // "string"
console.log(getType(true)); // "boolean"
console.log(getType(undefined)); // "undefined"
console.log(getType(null)); // "null"
console.log(getType({})); // "object"
console.log(getType([])); // "array"
console.log(getType(function() {})); // "function"
console.log(getType(Symbol())); // "symbol"

方法对比

方法适用场景优点缺点
typeof判断基本类型简单易用无法区分 null 和 object
instanceof判断引用类型可以判断对象的构造函数不适用于基本类型,跨框架可能失效
Object.prototype.toString判断所有类型准确区分所有类型语法稍复杂
Array.isArray判断数组专门用于数组,跨框架可靠仅适用于数组
=== 和 !==判断 null 和 undefined严格比较值和类型仅适用于特定场景