1、typeof
特点:
- 返回一个字符串,表示操作数的数据类型。
- 可以识别基本类型(如
number、string、boolean、undefined、symbol)。 - 对于
null和引用类型(如object、array、function),识别能力有限。 返回值:
| 类型 | 返回值 |
|---|---|
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
特点:
- 用于检查对象是否是某个构造函数的实例。
- 适用于判断引用类型(如
object、array、function)。 - 不能用于判断基本类型。
示例:
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 | 严格比较值和类型 | 仅适用于特定场景 |