js-js系列-数据类型-检测

Posted 有风吹过的地方丨

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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));
      

以上是关于js-js系列-数据类型-检测的主要内容,如果未能解决你的问题,请参考以下文章

js-js系列-数据类型-转换

从头认识js-js客户端检测

从头认识js-js中的继承

C++用来检测数据类型的声明工具源码

JS-JS模拟实现Promise-源码解析

从头认识js-js的发展历史