zoukankan      html  css  js  c++  java
  • 数据类型及数据类型的检测

     

    基本数据类型

    number  string  boolean  underfined  null;

    引用数据类型

    Object  Array  RegExp;

     


    typeof 检测数据类型 但是不能检测(对象、数组、正则)

    instanceof/constructor检测某一个实例是否属于一个类;

    我们的constructor可以避免instanceof检测的时候,用Object也是true的问题;

    console.log([].constructor === Object);//->false 

    局限性:
    1、用instanceof检测的时候,只要当前的这个类在实例的原型链上(可以通过原型链__proto__找到它),检测出来的结果都是true
    2、基本数据类型不能用instanceof来检测;

     


     

    对于对象数据类型,两种方式创建出来的都是所属类的一个实例,而且都是对象数据类型的值,是没有区别的,

    var ary =[];
    var ary = new Array;

    对于基本数据类型来说,不管哪种方式创建出来的都是所属类的一个实例,但字面量创建出来的是基本数据类型,实例创建的是对象数据类型

    var num =1var num2 = new Number("1"); 
    console.log(typeof num1,typeof num2);//->"number" "object"

    3、在类的原型继承中,instanceof检测出来的结果其实是不准确的

     

    function Fn(){    
    } ;
    Fn.prototype = new Array;
    var f = new Fn;
    console.log(f instanceof Array)-> true

    虽然Fn继承了Array,但是f没有length和数字索引那些东西,所以f应该不是数组才对,但是instance检测结果是true,以为f虽然不是数组,但是在f的原型链上可以找到Array;

     


     

     

    Object.prototype.toString.call(value)

    1)找到Object原型上的toString方法,让方法执行,并且让方法中的this变为value(value->就是我们要检测数据类型的值);

     

    ->toString:一个方法,转换为字符串数据类型用的方法
    每一个数据类型所属类的原型上都有toString方法,例如:Number.prototype/String.prototype/Array.prototype/Function.prototype...
    除了Object上的toString,其他类原型上的toString都是把当前的数据值转换为字符串的意思

    ->null和undefined比较的特殊:他们所属类Null/Undefined的原型上也有toString,只不过不让我们用而已,不仅如此其实类的原型都给屏蔽了;

    ->HTML元素对象的toString:虽然它的原型链很长,但是在其它类的原型上都没有toString,只有在最底层Object.prototype这上才有;

    var oDiv = document.getElementById("div1");
    oDiv.toString();调用的其实也是Object.prototype.toString...

    ->alert、document.write这两种输出的方式其实都是把要输出的内容先转换为字符串,然后在输出的

    alert([]);//->""
     alert(true);//->"true"
     alert({})->这个就要调用Object.prototype上的toString了 

    Object.prototype.toString是用来返回对应值的所属类信息的

    var oDiv = document.getElementById("div1");
     var obj = {};
     oDiv.toString();//->"[object HTMLDivElement]"
     obj.toString();//->"[object Object]"

    原理:
    ->obj首先找到原型上toString方法,并且让toString执行,toString方法执行的时候,里面的this是obj,

    同理oDiv.toString(),toString方法中的this是oDiv

    ->执行toString方法,返回当前方法中this的数据类型 ->"[object 当前this的直属类]",

    例如:"[object HTMLDivElement]"/"[object Object]"

    Object.prototype.toString.call(12);->执行原型上的toString,并且让方法中的this变为12,也就相当于返回的是12的直属类的信息 ->"[object Number]"

    Object.prototype.toString.call("hjj");//->"[object String]"
    依此类推:
    "[object Boolean]"/"[object Null]"/"[object Undefined]"/"[object Object]"/"[object Array]"/"[object RegExp]"/"[object Function]"/"[object Math]"/"[object Date]"...
    ->所有的数据类型都可以用它来检测,而且非常的精准;

     

     

  • 相关阅读:
    成为Java高手的25个学习目标
    JAVA程序员面试之《葵花宝典》
    成为Java高手的25个学习目标
    Java性能的十一个用法
    transit, transfer, convey>conveyance, transport>transportation
    托福常考的名词
    常见学科
    太傻Myoffer系统
    美国ARCO 权威托福考试参考词汇
    NTLDR和Bootfont.bin的作用
  • 原文地址:https://www.cnblogs.com/han6054/p/5343306.html
Copyright © 2011-2022 走看看