zoukankan      html  css  js  c++  java
  • js-js系列-数据类型-检测

    1. typeof

      1. 1. 对于原始类型来说,除了 null 都可以调用typeof显示正确的类型
        
        typeof 1 // 'number'
        typeof '1' // 'string'
        typeof undefined // 'undefined'
        typeof true // 'boolean'
        typeof Symbol() // 'symbol'
        typeof null // 'object'
        
        2. 但对于引用数据类型,除了函数之外,都会显示"object"。
        
        typeof [] // 'object'
        typeof {} // 'object'
        typeof console.log // 'function'
        
        3. 因此采用typeof判断对象数据类型是不合适的,采用instanceof会更好,instanceof的原理是基于原型链的查询,只要处于原型链中,判断永远为true
        4. 如果是null 则返回object
        5. https://blog.csdn.net/qq_38722097/article/details/80717240
        
      2. 1. typeof 一般被用于判断一个变量的类型
        2. 我们可以利用 typeof 来判断number, string, object, boolean, function, undefined, symbol 这七种类型
        3. 在判断不是 object 类型的数据的时候,typeof能比较清楚的告诉我们具体是哪一类的类型
        4. typeof 在判断一个 object的数据的时候只能告诉我们这个数据是 object, 而不能细致的具体到是哪一种 object
        typeof是一个运算符,有2种使用方式:typeof(表达式)和typeof 变量名,第一种是对表达式做运算,第二种是对变量做运算。
        
    2. instanceof

      1. 核心: 原型链的向上查找。(右侧构造函数指向的原型对象是否存在于左侧实例对象的原型链上)

      2. function myInstanceof(left, right) {
            //基本数据类型直接返回false
            if(typeof left !== 'object' || left === null) return false;
            //getProtypeOf是Object对象自带的一个方法,能够拿到参数的原型对象
            let proto = Object.getPrototypeOf(left);
            while(true) {
                //查找到尽头,还没找到
                if(proto == null) return false;
                //找到相同的原型对象
                if(proto == right.prototype) return true;
                proto = Object.getPrototypeof(proto);
            }
        }
        
    3. Object.is和===的区别?

      1. Object在严格等于的基础上修复了一些特殊情况下的失误,具体来说就是+0和-0,NaN和NaN。
        Object.is() 方法判断两个值是否是相同的值。表示两个参数是否相同的布尔值 。
        
        
    4. == 和 ===有什么区别?

      1. 1. ===叫做严格相等,是指:左右两边不仅值要相等,类型也要相等,例如'1'===1的结果是false,因为一边是string,另一边是number。
        2. ==不像===那样严格,对于一般情况,只要值相等,就返回true,但==还涉及一些类型转换,它的转换规则如下:
           1. 两边的类型是否相同,相同的话就比较值的大小,例如1==2,返回false
           2. 判断的是否是null和undefined,是的话就返回true
           3. 判断的类型是否是String和Number,是的话,把String类型转换成Number,再进行比较
           4. 判断其中一方是否是Boolean,是的话就把Boolean转换成Number,再进行比较
           5. 如果其中一方为Object,且另一方为String、Number或者Symbol,会将Object转换成字符串,再进行比较
        
    5. Object.prototype.toString()

      1. var obj=new Object({a:3})
        // console.dir(obj);
        // console.dir(['obj'].toString());
        // console.dir(obj.toString===Object.prototype.toString);
        console.dir(obj.toString===Object.prototype.toString);
        console.log(obj.toString());
        // console.log(Object.prototype.toString.call(1));
        
  • 相关阅读:
    在 Queue 中 poll()和 remove()有什么区别?
    jdk 8 HashMap源码解读
    java 中,没有任何方法和成员变量的接口
    ArrayList、LinkedList、Vector、Array
    StringBuilder和StringBuffer
    Collection
    jdk代理和cglib代理源代码之我见
    多 线程
    Spring的@Enable*注解的工作原理
    redis 学习
  • 原文地址:https://www.cnblogs.com/ycyc123/p/14823933.html
Copyright © 2011-2022 走看看