2-1. JavaScript 数据类型检查
在 JavaScript 中,类型检查主要依赖于以下方法:
1. typeof
操作符
typeof
操作符用于检查基本数据类型(如 number
, string
, boolean
)和一些特殊类型(如 undefined
, symbol
)。
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" (这是一个历史遗留问题)
2. instanceof
操作符
instanceof
用于检查对象是否是某个构造函数的实例。适用于对象类型和继承链中的对象。
console.log([] instanceof Array); // true
console.log({} instanceof Object); // true
console.log(new Date() instanceof Date); // true
console.log(function(){} instanceof Function); // true
3. Array.isArray()
Array.isArray()
专门用来检查一个值是否为数组。
console.log(Array.isArray([1, 2, 3])); // true
console.log(Array.isArray('hello')); // false
4. Object.prototype.toString.call()
Object.prototype.toString.call()
方法可以提供更详细的数据类型信息。它常用于检查复杂对象类型。
console.log(Object.prototype.toString.call(42)); // "[object Number]"
console.log(Object.prototype.toString.call('hello')); // "[object String]"
console.log(Object.prototype.toString.call([])); // "[object Array]"
console.log(Object.prototype.toString.call({})); // "[object Object]"
console.log(Object.prototype.toString.call(null)); // "[object Null]"
console.log(Object.prototype.toString.call(new Date())); // "[object Date]"
5. isNaN()
和 Number.isNaN()
isNaN()
用于检查一个值是否是 NaN
。需要注意,isNaN()
在进行类型转换时可能会产生意外结果。Number.isNaN()
用于检查一个值是否是 NaN
,不会进行类型转换。
console.log(isNaN('hello')); // true (因为 'hello' 转换成了 NaN)
console.log(Number.isNaN('hello'));// false
console.log(Number.isNaN(NaN)); // true
console.log(Number.isNaN(42)); // false
6. 自定义检查函数
你可以编写自定义函数来进行更复杂的类型检查。适用于需要根据特定条件判断数据类型的场景。
function isString(value) {
return typeof value === 'string' || value instanceof String;
}
console.log(isString('hello')); // true
console.log(isString(new String('hello'))); // true
console.log(isString(42)); // false
总结
typeof
: 适用于基本数据类型(number
,string
,boolean
,undefined
,symbol
)。instanceof
: 适用于检查对象实例及其继承链。Array.isArray()
: 专门用于检查数组。Object.prototype.toString.call()
: 提供详细的对象类型信息。isNaN()
和Number.isNaN()
: 检查NaN
值。- 自定义检查函数: 适用于更复杂的类型检查需求。