在 JavaScript 中,可以通过多种方式来判断数据类型,以下是常用的几种方法:
1. typeof
操作符
typeof
用于判断基本数据类型和部分对象类型。
console.log(typeof 123); // "number"
console.log(typeof "hello"); // "string"
console.log(typeof true); // "boolean"
console.log(typeof undefined); // "undefined"
console.log(typeof null); // "object" (这是一个已知的历史问题)
console.log(typeof {}); // "object"
console.log(typeof function() {}); // "function"
console.log(typeof Symbol()); // "symbol"
缺点:对 null
和对象类型的区分不够精确。
2. Object.prototype.toString.call()
更精确地判断所有类型,尤其是对象类型。
console.log(Object.prototype.toString.call(123)); // "[object Number]"
console.log(Object.prototype.toString.call("hello")); // "[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(function() {})); // "[object Function]"
console.log(Object.prototype.toString.call(new Date())); // "[object Date]"
优点:可区分各种对象类型,比如 Array
、Date
等。
3. instanceof
操作符
判断某个对象是否属于某个构造函数的实例。
console.log([] instanceof Array); // true
console.log({} instanceof Object); // true
console.log(function() {} instanceof Function); // true
console.log(new Date() instanceof Date); // true
注意:instanceof
依赖原型链,因此对于跨 iframe 或不同全局作用域的对象可能会失效。
4. Array.isArray()
专门用来判断是否为数组。
console.log(Array.isArray([])); // true
console.log(Array.isArray({})); // false
5. 自定义类型判断函数
结合 typeof
和 Object.prototype.toString
。
function getType(value) {
if (value === null) return "null";
if (typeof value === "object") {
return Object.prototype.toString.call(value).slice(8, -1).toLowerCase();
}
return typeof value;
}
console.log(getType(123)); // "number"
console.log(getType("hello")); // "string"
console.log(getType([])); // "array"
console.log(getType(null)); // "null"
console.log(getType(new Date())); // "date"
总结
- 快速判断:使用
typeof
。 - 精确区分:使用
Object.prototype.toString.call()
。 - 检查实例:使用
instanceof
。 - 数组检测:使用
Array.isArray()
。
根据需求选择合适的方法!