javascript四种类型识别的方法

Posted 刘飞fei

tags:

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

 

以上是关于javascript四种类型识别的方法的主要内容,如果未能解决你的问题,请参考以下文章

四种类型的文法总结

JavaScript获取人类可识别的文件大小转换显示 和 格式化数字类型,保留小数点后几位,非四舍五入

使用具有正确语法的 pandas to_datetime() 方法,无法识别的值类型:str?

无法识别的语句类型。 (位置 0 的“WITH”附近)

错误:无法识别的符号类型“”

人脸识别的一些资源