JavaScript判断数据类型方法?

1.typeof

  目前只能返回8种数据类型string,number,boolean,symbol,bigint,unfined,object,function

  typeof(null) 结果为object

symbol:

  ES6 引入了一种新的原始数据类型 Symbol ,表示独一无二的值,最大的用法是用来定义对象的唯一属性名。
bigint:

  数据类型的目的是比数据类型支持的范围更大的整数值。在对大整数执行数学运算时,以任意精度表示整数的能力尤为重要。使用bigint整数溢出将不再是问题。

2.instanceof

  一般用来判断引用数据类型

var arr = [1,2,3]
console.log(arr instanceof Array)
//true

instanceof原理

  用于判断某个实例是否属于某构造函数

  在继承关系中用来判断一个实例是否属于它的父类型或者祖先类型的实例

  说白了,只要右边变量的 prototype 在左边变量的原型链上即可。因此,instanceof 在查找的过程中会遍历左边变量的原型链,直到找到右边变量的 prototype,如果查找失败,则会返回 false

function self_instanceof(lVal,rVal){    
    // 验证如果为基本数据类型,就直接返回false
    const baseType = ['string', 'number','boolean','undefined','symbol']
    if(baseType.includes(typeof(lVal))) { 
    return false
   } let RP
= rVal.prototype; //取 R 的显示原型 lVal = lVal.__proto__; //取 L 的隐式原型 while(true){ // 无线循环的写法(也可以使 for(;;) ) if(lVal === null){ //找到最顶层 return false; } if(lVal === RP){ //严格相等 return true; } lVal = lVal.__proto__; //没找到继续向上一层原型链查找 } }

3.Object.prototype.toString.call()

  这是最为准确的方法

  Object.prototype.toString.call(m)
  Object.prototype.toString.call("jerry");  //[object String]
  Object.prototype.toString.call(12);       //[object Number]
  Object.prototype.toString.call(true);     //[object Boolean]
  Object.prototype.toString.call(undefined);    //[object Undefined]
  Object.prototype.toString.call(null);    //[object Null]
  Object.prototype.toString.call({name: "jerry"});   //[object Object]
  Object.prototype.toString.call(function(){});  //[object Function]
  Object.prototype.toString.call([]);   //[object Array]
  Object.prototype.toString.call(new Date);   //[object Date]
  Object.prototype.toString.call(/\d/);   //[object RegExp]
  function Person(){};
  Object.prototype.toString.call(new Person);   //[object Object]
原理:
  在toString方法被调用时,会执行下面的操作步骤:
    1. 获取this对象的[[Class]]属性的值.
    2. 计算出三个字符串"[object ", 第一步的操作结果Result(1), 以及 "]"连接后的新字符串.
    3. 返回第二步的操作结果Result(2).
[[class]]是什么?
  是这么定义的:一个字符串值,表明了该对象的类型
  原生对象的[[class]]内部属性的值一共有10种.分别是:"Array", "Boolean", "Date", "Error", "Function", "Math", "Number", "Object", "RegExp", "String".
为什么需要Object原型上的toString方法?
  在JavaScript中,所有类都继承于Object,因此toString()方法应该也被继承了,其实各数据类型使用toString()后的结果表现不一的原因在于:所有类在继承Object的时候,改写了toString()方法。 Object原型上的方法是可以输出数据类型的。因此我们想判断数据类型时,也只能使用原始方法。继而有了此方法:Object.prototype.toString.call(obj)

原文地址:https://www.cnblogs.com/cqweb/p/14143184.html