• js检测数据类型总结


    目录

    一、typeof

    二、instanceof

    三、constructor

    四、Object.prototype.toString.call()

    Object.prototype.toString.call(obj)类型检测原理

    五、__proto__

    六、 其他


    一、typeof

    1. typeof在对值类型numberstringboolean symbol、 undefined、 function的反应是精准的;
    2. 但对于对象{ } 、数组[ ] 、null 都会返回 object

    1. console.log(typeof ""); // string
    2. console.log(typeof 1); // number
    3. console.log(typeof NaN); // number
    4. console.log(typeof true); // boolean
    5. console.log(typeof Symbol(1)) // "symbol"
    6. console.log(typeof undefined); // undefined
    7. console.log(typeof function(){}); // function
    8. console.log(typeof null); // object (巨坑...)
    9. console.log(typeof []); // object
    10. console.log(typeof {}); //object

    二、instanceof

    instanceof可以正确判断对象的类型,其内部运行机制是判断在其原型链中能否找到该类型的原型

    1. 用 instanceof 判断一个实例是否属于某种类型

    2. instanceof 运算符只能正确判断引用数据类型,而不能判断基本数据类型
    1. // 检测构造函数B的原型是否有出现在对象A的原型链上。
    2. A instanceof
    3. [] instanceof Array // true
    4. [].__proto__ == Array.prototype // true
    5. console.log([] instanceof Array); // true
    6. console.log([] instanceof Object); // true
    7. console.log({} instanceof Object); //true
    8. console.log(function(){} instanceof Function); // true
    9. console.log(function(){} instanceof Object); // true
    10. console.log((new Number(1)) instanceof Number); // true
    11. console.log((new Number(1)) instanceof Object); // true
    12. //注意
    13. console.log(undefined instanceof undefined); // 报错
    14. console.log(null instanceof null); // 报错

    三、constructor

    constructor 是每个实例对象都拥有的属性

    constructor有两个作用:

    1. 判断数据的类型;
    2. 对象实例通过 constrcutor 对象访问它的构造函数;
    1. function Hello() {}; // 构造函数
    2. var h = new Hello(); // 实例化对象
    3. console.log(Hello.prototype.constructor == Hello); // true
    4. console.log(h.constructor == Hello); // true ()
    5. console.log(("1").constructor === String); // true
    6. console.log((1).constructor === Number); // true
    7. console.log((NaN).constructor === Number); // true
    8. console.log((true).constructor === Boolean); // true
    9. console.log(([]).constructor === Array); // true
    10. console.log((function () {}).constructor === Function); // true
    11. console.log(({}).constructor === Object); // true
    12. console.log((Symbol(1)).constructor === Symbol); // true
    13. console.log((null).constructor === Null); // 报错
    14. console.log((undefined).constructor === Undefined); // 报错

    costructor来判断类型看起来是完美的,然而,如果我创建一个对象,更改它的原型,这种方式也变得不可靠了

    1. function Fn(){};
    2. Fn.prototype=new Array(); // 改变原型
    3. var f=new Fn();
    4. console.log(f.constructor===Fn); // false
    5. console.log(f.constructor===Array); // true

    这里声明了一个Fn的构造函数,并且把他的原型指向了Array的原型,所以这种情况下,constructor也显得力不从心了。

    四、Object.prototype.toString.call()

    使用 Object 对象的原型方法 toString 来判断数据类型:完美精准 的返回各种数据类型

    1. const a = Object.prototype.toString;
    2. console.log(a.call(1)); // [object Number]
    3. console.log(a.call("1")); // [object String]
    4. console.log(a.call(NaN)); // [object Number]
    5. console.log(a.call(true)); // [object Boolean]
    6. console.log(a.call(Symbol(1))); // [object Symbol]
    7. console.log(a.call(null)); // [object Null]
    8. console.log(a.call(undefined)); // [object Undefined]
    9. console.log(a.call([])); // [object Array]
    10. console.log(a.call({})); // [object Object]
    11. console.log(a.call(function () {})); // [object Function]
    12. function Fn(){};
    13. Fn.prototype=new Array(); // 改变原型
    14. var f=new Fn();
    15. console.log(a.call(Fn)); // [object Function]

    稍微简单封装下:

    1. // 定义检测数据类型的功能函数
    2. function checkedType(target) {
    3. return Object.prototype.toString.call(target).slice(8, -1);
    4. }
    5. console.log(checkedType(1)); // Number
    6. console.log(checkedType("1")); // String
    7. console.log(checkedType(NaN)); // Number
    8. console.log(checkedType(true)); // Boolean
    9. console.log(checkedType(Symbol(1))); // Symbol
    10. console.log(checkedType(null)); // Null
    11. console.log(checkedType(undefined)); // Undefined
    12. console.log(checkedType([])); // Array
    13. console.log(checkedType({})); // Object
    14. console.log(checkedType(function () {})); // Function

    Object.prototype.toString.call(obj)类型检测原理

    Object原型上的toString方法作用在传入的obj的上下文中(通过callthis指向obj

    五、__proto__

    1. var arr = []'
    2. arr.__proto__ === Array.prototype; // true
    3. var obj = {}'
    4. obj.__proto__ === Object.prototype; // true
    5. var str = '';
    6. str.__proto__ === String.prototype; // true
    7. var num = 0;
    8. num.__proto__ === Number.prototype; // true

    六、 其他

    1. 通过ES6的Array.isArray()做判断

    Array.isArrray(obj);
    
    1. 通过Array.prototype.isPrototypeOf

    Array.prototype.isPrototypeOf(obj)
    

  • 相关阅读:
    腾讯云部署springboot jar包过程
    拒绝“内卷”跃迁软件测试最大门槛,我是如何从月薪8K到15K的?
    在Android Studio中连接字符串之前添加@SuppressLint(“settexti18n”)注释
    JavaScript中的异步编程
    学习记录十六 ---- spring boot
    vector的模拟实现
    Iptables扩展模块-connlimit 限制并发连接数
    python最常用的三种输出格式
    消失的遗传力的进一步剖分及应用
    排序(二分法查找、冒泡排序、选择排序、插入排序以及快速排序)
  • 原文地址:https://blog.csdn.net/m0_64346035/article/details/133438473