【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]

 

posted @ 2022-10-29 21:01  Ahoge的笔记本  阅读(20)  评论(0编辑  收藏  举报