• javascript四种类型识别的方法


    JavaScript 数据类型

    值类型(基本类型):字符串(String)、数字(Number)、布尔(Boolean)、对空(Null)、未定义(Undefined)、Symbol。

    引用数据类型:对象(Object)、数组(Array)、函数(Function)。

    注:Symbol 是 ES6 引入了一种新的原始数据类型,表示独一无二的值。

    typeof运算符

    typeof是一元运算符,放在单个操作数的前面,返回值为表示操作数类型的首字母小写的字符串

      [注意]typeof运算符后面带不带圆括号都可以

    识别

      【1】可以识别标准类型(将Null识别为'object') 

      【2】不能识别具体的对象类型(Function除外)

      console.log(typeof 1); // number
      console.log(typeof '1'); // string
      console.log(typeof null); // object
      console.log(typeof d); // undefined
      console.log(typeof {}); // object
      console.log(typeof []); // object
      console.log(typeof function () {}); // function
      console.log(typeof Symbol('h')); // symbol

    由以上可以看出typeof可以判断大多数数据类型,但是对于null数组和对象返回的都是object。

     [注意]判断一个值是否为null类型的最佳方法是直接和null进行恒等比较

      console.log(null === null); // true
      console.log(undefined === null); // false

    instanceof运算符

            instanceof是一个二元运算符,左操作数是一个对象,右操作数是一个构造函数。如果左侧的对象是右侧构造函数的实例对象,则表达式返回true;否则返回false

      如果左操作数不是对象,返回false,如果右操作数不是函数,则抛出一个类型错误异常TypeError

     [注意]所有的对象都是Object的实例

    识别

      【1】可以识别内置对象类型、自定义类型及其父类型

      【2】不能识别标准类型,会返回false

      【3】不能识别undefined、null,会报错

      基本类型

      console.log("string" instanceof String);//false
      console.log(1 instanceof Number);//false
      console.log(Symbol('h') instanceof Symbol); // false
      console.log(true instanceof Boolean);//false
      console.log(undefined instanceof Undefined);//报错
      console.log(null instanceof Null);//报错

      内置对象类型

      var arr = [], obj = {}, fun = function () {};
      console.log(arr instanceof Array, arr instanceof Object, arr instanceof Function); // true true false
      console.log(obj instanceof Array, obj instanceof Object, obj instanceof Function); // false true false
      console.log(fun instanceof Array, fun instanceof Object, fun instanceof Function); // false true true
      console.log(new Date instanceof Date); // true
      console.log(/d/ instanceof RegExp); // true

      typeof 结合 instanceof 封装一个识别数据类型的方法,可以识别数组与对象。

    function getType(param) {
        var typeString = typeof param;
        if (param === null) return 'null';
        if (typeString !== 'object') return typeString; 
        if (!(param instanceof Array)) return 'object';
        if (param instanceof Array) return 'array';
        return '未知类型';
      }

    我们可以用下面的代码实现instanceof。

    function instance(left,right){
        let prototype = right.prototype;  //获取类型的原型
        let proto = left.__proto__;       //获取对象的原型
        while(true){    //循环判断对象的原型是否等于类型的原型,直到对象原型为null,因为原型链最终为null
           if (proto === null || proto === undefined){
               return false;
           }
           if (proto === prototype){
               return true;
           }
           proto = proto.__proto__;
         }
    }
    console.log(instance({},Object)); //true
    console.log(instance([],Number)); //false
    

      

    constructor属性

    实例对象的constructor属性指向其构造函数。如果是内置类型,则输出function 数据类型(){[native code]};如果是自定义类型,则输出function 数据类型(){}

    识别

      【1】可以识别标准类型、内置对象类型及自定义类型

      【2】不能识别undefined、null,会报错,因为它俩没有构造函数

      var s = Symbol('s'), fun = function () {};
      console.log((1).constructor); // ƒ Number() { [native code] }
      console.log(('1').constructor); // ƒ String() { [native code] }
      console.log(true.constructor); // ƒ Boolean() { [native code] }
      console.log([].constructor); // ƒ Array() { [native code] }
      console.log({}.constructor); // ƒ Object() { [native code] }
      console.log(fun.constructor); // ƒ Function() { [native code] }
      console.log(s.constructor); // ƒ Symbol() { [native code] }
      console.log(null.constructor); // 报错
      console.log(undefined.constructor); // 报错

        使用构造函数封装一个识别数据类型的方法

      function getType(param) {
        if (param === null) return 'null';
        if (param === undefined) return 'undefined';
        var typeString = param.constructor.toString();
        return typeString.replace(/^function (w+)().+$/,'$1'); 
      }

    Object.prototype.toString()方法

      对象的类属性是一个字符串,用以表示对象的类型信息。javascript没有提供设置这个属性的方法,但有一种间接方法可以查询它。Object.prototype.toString()方法返回了如下格式的字符串:[object 数据类型]

    识别

      【1】可以识别标准类型及内置对象类型

      【2】不能识别自定义类型

      console.log(Object.prototype.toString.call(1)); // [object Number]
      console.log(Object.prototype.toString.call('1')); // [object String]
      console.log(Object.prototype.toString.call(true)); // [object Boolean]
      console.log(Object.prototype.toString.call(null)); // [object Null]
      console.log(Object.prototype.toString.call(undefined)); // [object Undefined]
      console.log(Object.prototype.toString.call([])); // [object Array]
      console.log(Object.prototype.toString.call({})); // [object Object]
      console.log(Object.prototype.toString.call(function () {})); // [object Function]
      console.log(Object.prototype.toString.call(Symbol('s'))); // [object Symbol]

      将Object.prototype.toString()方法封装成一个类型识别方法

      function getType(param) {
        return Object.prototype.toString.call(param).replace(/^[object (w+)]$/,'$1'); 
      }
  • 相关阅读:
    HDU_2030——统计文本中汉字的个数
    HDU_2028——求多个数的最小公倍数
    HDU_2027——统计元音
    HDU_2026——将单词的首字母变大写
    HDU_2025——查找最大的字母
    HDU_2024——判断字符串是否是c语言合法标识符
    HDU_2023——求平均成绩
    HDU_2022——海选女主角
    HDU_2021——最少RMB问题
    HDU_2020——按绝对值排序
  • 原文地址:https://www.cnblogs.com/weblff/p/9776402.html
Copyright © 2020-2023  润新知