基本数据类型
集合引用类型
类型判断
typeof
typeof 适合基础类型的判断。
缺点:
- 无法区分 null 和 object(
typeof null === 'object'
是一个设计缺陷)。 - 无法区分具体对象类型(如数组和普通对象)。
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 {}); // 'object'
console.log(typeof function(){}); // 'function'
instanceof
instanceof 用于判断对象是否是某个构造函数的实例。
缺点:
- 不适用于原始类型。
- 不适用于跨 iframe 或窗口的环境(因为原型链不一致)。
console.log([] instanceof Array); // true
console.log({} instanceof Object); // true
console.log([] instanceof Object); // true,因为 Array 是 Object 的子类
console.log(() => {} instanceof Function); // true
console.log(new Date() instanceof Date); // true
Array.isArray
这是专门用来判断数组的方法,是 ES5 中新增的。
console.log(Array.isArray([])); // true
console.log(Array.isArray({})); // false
值得注意的是,Array.isArray 不会受跨窗口的影响,因为它是通过检查对象的内部属性([[Class]]
)来判断是否为数组,而不是依赖于原型链。
constructor 属性
通过访问对象的 constructor
属性可以判断类型。
console.log((123).constructor === Number); // true
console.log('hello'.constructor === String); // true
console.log(true.constructor === Boolean); // true
console.log([].constructor === Array); // true
console.log({}.constructor === Object); // true
缺点:
- 无法判断 null 和 undefined(它们没有 constructor 属性)。
- 可能会被重写。
Object.prototype.toString.call
这是判断具体类型的最常用方法,通过调用对象的 toString 方法返回具体的类型信息:'[Obejct [[Class]]]'
。
console.log(Object.prototype.toString.call(123)); // '[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(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(() => {})); // '[object Function]'
console.log(Object.prototype.toString.call(new Date())); // '[object Date]'