【JS】数据类型检测
数据类型检测方法:
1. typeof
2. instanceof
3. Object.prototype.toSting.call()
/*
1.typeof 运算符
返回值:参数类型字符串
- 可以区分基本数据类型,除了null
- 无法区分null、Array等内建对象、Object,结果都为object
*/
// 检验基本类型数据
console.log(typeof 1); // number
console.log(typeof 'a'); // string
console.log(typeof true); // boolean
console.log(typeof undefined); // undefined
console.log(typeof Symbol('s')); // symbol
console.log(typeof 9n); // bigint
console.log(typeof null); // object
// 检验引用类型数据
console.log(typeof {}); // object
console.log(typeof []); // object
console.log(typeof function(){}); // function
/*
2.instanceof
1. instanceof是如何判断的?
- 表达式:A instanceof B
- 1.如果B中有静态方法 Symbol.hasInstance,那就直接调用这个方法
- 2.如果B函数的显示原型对象在A对象的原型链上,返回true,否则返回fasle
*/
class Animal {}
class Cat extends Animal {}
const cat = new Cat()
console.log(cat instanceof Cat); // true
console.log(cat instanceof Animal); // true
/*
2. Function是通过new自己产生的实例 Function.__proto__ == Function.prototype
3. objA.isPrototypeOf(objB), 检查objA是否是objB的原型,所以可以使用Class.prototype.isPrototypeOf(obj) 检查一个对象是否是一个类的实例。
// ...
console.log(Cat.prototype.isPrototypeOf(cat)); // true
*/
/*
instanceof
能够区分Array、Object和Function,适合用于判断自定义的类实例对象
无法区分基本数据类型
*/
// 检验原始类型数据
console.log(1 instanceof Number); // false
console.log('a' instanceof String); // false
console.log(true instanceof Boolean); // false
console.log(Symbol('s') instanceof Symbol); // false
console.log(9n instanceof BigInt); // false
// 检验引用类型数据
console.log({} instanceof Object); //true
console.log([] instanceof Array); // true
console.log(function(){} instanceof Function); // true
3. Object.prototype.toString.call()
- 精准判断数据类型
- 原始数据类型,内建对象,包含 Symbol.toStringTag 属性的对象
- 内建的 toString 方法可以被从对象中提取出来,并在任何其他值的上下文中执行。
const objToString = Object.prototype.toString
const arr = []
console.log(objToString.call(arr)); // [object Array]
- 用 {}.toString.call 替代 instanceof, 不仅能检查类型还能返回类型信息,而且原始类型也能检查。
可以使用特殊的对象属性 Symbol.toStringTag 自定义对象的 toString 方法的行为。
const obj = {
[Symbol.toStringTag]: 'custom'
}
console.log({}.toString.call(obj)); // [object custom]