• JS判断数据类型的方式


     

    var a = "iamstring.";
    var b = 222;
    var c= [1,2,3];
    var d = new Date();
    var e = function(){alert(111);};
    var f = function(){this.name="22";};

    判断数据类型的方式:

    1、typeof

    alert(typeof a)   ------------> "string"
    alert(typeof b)   ------------> "number"
    alert(typeof c)   ------------> "object"
    alert(typeof d)   ------------> "object"
    alert(typeof e)   ------------>"function"
    alert(typeof f)   ------------> "function"


    其中typeof返回的类型都是字符串形式,需注意,例如:
    alert(typeof a == "string") -------------> true
    alert(typeof a == String) ---------------> false
    另外typeof 可以判断function的类型;在判断除Object类型的对象时比较方便。

    typeof返回类型只有undefined、string、boolean、number、object、function六种,null、array、object的返回类型是object

    typeof不适合判断null和引用类型。

    2、instancof

    instanceof用来判断A是否是B的实例,该方法也会向原型链上查找。

    这种方法也存在一定问题,认为数组[]也是Object的实例。

    alert(c instanceof Array) ---------------> true
    alert(c instanceof Object) ---------------> true
    alert(d instanceof Date) 
    alert(f instanceof Function) ------------> true
    alert(f instanceof function) ------------> false
    
    alert(f instanceof Object) ------------> true
    注意:instanceof 后面一定要是对象类型,并且大小写不能错,该方法适合一些条件选择或分支。
    
    
    分析一下[]、Array、Object三者之间的关系:
    
    [].__proto__=Array.prototype,而Array.prototype.__proto__=Object.Prototype,Object.prototype.__proto__=null
    因此,instanceof只能用来检测两个对象是否在一条原型链上,并不能检测出对象的具体类型。

    3、Object.prototype.toString.call(obj)

    Object.prototype.toString.call(a) === "[object String]"
    Object.prototype.toString.call(b) === "[object Number]"
    Object.prototype.toString.call(c) === "[object Array]"
    (Object.prototype.toString.call(d) ==="[object Date]" 
    Object.prototype.toString.call(e) ==="[object Function]"
    Object.prototype.toString.call(f) === "[object Function]" 大小写不能写错,比较麻烦,但胜在通用。

    为什么不直接用obj.toString()呢?

      从原型链的角度来讲,所有对象的原型链最终都指向Object,根据JS的变量查找规则,其他对象也是可以直接访问到Object.toString()方法的,但是实际上,大部分对象都已经实现了自身的toString()方法,这样就会导致Object的toString()被终止查找,

    因此,我们使用call()方法来强制执行Object的toString()方法。

    Object.toString.call(obj)与Object.prototype.toString.call(obj)的区别:

    由上图可知,Object对象和他的原型链上各自有一个toString()方法,第一个返回的是函数,第二个返回的是值类型。

    4、constructor

    console.log(("1").constructor===String);   //true
    console.log((1).constructor===Number);     //true
    console.log((true).constructor===Boolean);  //true
    console.log(([]).constructor===Array);     //true
    console.log((function(){}).constructor===Function);  //true
    console.log(({}).constructor===Object);    //true

      以上确实没有问题,但是》》》》

    function F(){};
    F.prototype={};
    var f=new F();
    console.log(f.constructor===F);  //false
    console.log(f.constructor===Function);  //false
    console.log(f.constructor===Object);  //true
    console.log(F.constructor===Function);  //true

      当一个函数F被创建时,JS引擎会自动为其添加prototype原型对象,然后该原型对象包含两个指针:__proto__和constructor,constructor用来指向函数本身。即:F.prototype.constructor==F    ----->true

      但是当F被当作构造函数使用时var f=new F(); 这时F原型上的constructor就会被转移到了实例对象f上,所以f.constructor==F   ----->true。。如果对F.prototype赋值{},而{}是new Object()的一个实例对象,因此new Object()会将其原型上的constructor传递给{}。

    通过函数判断类型

    function getDataType(obj){
           if(obj===null){
                  return null;
            }
            else if(typeof(obj)=='object'){
                  if(obj instanceof Array){
                          return 'array';
                   }
                   else{
                         return 'object';
                    }
            }
            else{
                   return typeof(obj);
             }
    }
  • 相关阅读:
    IO流
    集合中的工具类Collections和Arrays
    排序 查找
    函数及数组
    变量、静态的和单例模式
    java流程控制
    configure使用
    --sysroot
    LD_PRELOAD
    Linux下内存检测工具:asan :编译-连接-运行选项
  • 原文地址:https://www.cnblogs.com/xiaoan0705/p/8674794.html
Copyright © 2020-2023  润新知