目录
1. 前言
在JavaScript中,类型判断是编写稳健和可靠代码的关键。JavaScript具有动态类型系统,变量的类型可以在运行时改变,因此正确判断类型非常重要。
2. 基本类型判断
JavaScript中的基本类型包括:undefined
、null
、boolean
、number
、string
、symbol
。
2.1 typeof 操作符
typeof
操作符返回一个字符串,表示未经计算的操作数的类型。
typeof undefined; // "undefined"
typeof null; // "object"(历史遗留问题,实际上应为 "null")
typeof true; // "boolean"
typeof 42; // "number"
typeof "foo"; // "string"
typeof Symbol(); // "symbol"
typeof function(){}; // "function"
typeof {}; // "object"
typeof []; // "object"
需要注意的是,typeof null
返回 "object"
是JavaScript语言的一个已知问题,而非类型判断的准确表达。
2.2 instanceof 操作符
instanceof
操作符用于判断一个对象是否是某个构造函数的实例。
let arr = [];
arr instanceof Array; // true
function Foo() {}
let fooInstance = new Foo();
fooInstance instanceof Foo; // true
2.3 constructor 属性
对象的 constructor
属性指向创建该对象的构造函数。
let obj = {};
obj.constructor === Object; // true
let num = new Number(42);
num.constructor === Number; // true
3. 复杂类型判断
JavaScript中的复杂类型包括:Array
、Object
、Function
等。
3.1 Array.isArray() 方法
Array.isArray()
方法用于判断对象是否为数组。
Array.isArray([]); // true
Array.isArray({}); // false
Array.isArray(null); // false
3.2 Object.prototype.toString.call() 方法
Object.prototype.toString.call()
方法可以更精确地判断对象的类型。
Object.prototype.toString.call([]); // "[object Array]"
Object.prototype.toString.call({}); // "[object Object]"
Object.prototype.toString.call(null); // "[object Null]"
Object.prototype.toString.call(undefined); // "[object Undefined]"
Object.prototype.toString.call(42); // "[object Number]"
Object.prototype.toString.call("foo"); // "[object String]"
Object.prototype.toString.call(function(){}); // "[object Function]"
Object.prototype.toString.call(Symbol()); // "[object Symbol]"
4. 特殊情况
在进行类型判断时,需要注意JavaScript的一些特殊情况,如 NaN
、Infinity
、-Infinity
的判断方法。
isNaN(NaN); // true
isFinite(Infinity); // false
isFinite(-Infinity); // false
5. 总结
JavaScript中的类型判断涵盖了基本类型和复杂类型,使用不同的操作符和方法可以确保精确判断对象的类型。合理的类型判断有助于避免类型错误和提高代码的健壮性。