美文网首页
关于js的数据类型检测(最详细解读)

关于js的数据类型检测(最详细解读)

作者: 费莫斯 | 来源:发表于2018-10-15 11:31 被阅读0次

    从数据类型开始

    基本数据类型:Null,Undefined,Number,String,Boolean

    引用类型:Object,Array,Date,RegExp,Function

    数据类型检测目的:区分每一种数据类型

    方法一:typeof关键字

    一般用于基本数据类型检测

    =>"number"(任何数字检测包括NaN,Infinity等)

    =>“undefined”(undefined,未声明及未定义的变量)

    =>“string”(任何字符串)

    =>“boolean”(true,false)

    =>"object"(null,数组,对象,实例如new Date(),new Function()仍然输出“function”)

    =>"function"(函数,如Function ,Date,String)

    方法二:constructor

    几乎所有函数都有一个名为prototype的属性

    prototype.constructor == 该函数

    每个对象都有一个__proto__属性,该属性指向该对象的构造函数的ptrototype

    原型链实现如图:(补充:Array,Date等引用类型createdby Function,Array.prototype.__proto__ === Object.prototype,与下图中Foo差不多)

    [].constructor => Array

    {}.constructor=>Object

    Object.constructor=>Function(引用类型的构造函数由new Function生成)

    Array.constructor=>Function

    Function.constructor=>Function(Function也是Function的实例)

    (Array,Function).prototype.constructor=>Object

    Object.prototype.__proto__ == null

    局限性:constructor并不准确,可以被改写

    function Person(){

    }

    function Person2(){

    }

    Person.prototype={

    constructor:Person2

    }

    var person = new Person()

    person.constructor == Person2 (true)

    方法三:instanceof

    判断实例是否属于某个类型

    实现原理:

    局限性

    可以被改写,详细见constructor示例

    只能用于引用类型的检测

    所有对象类型都是Object的实例:

    演算:Array instanceof Object =>true

    var O = Object.prototype;

    var L = Array.__proto__;

    L != O;//Array.__proto__ == Function.prototype;

    L = Function.prototype.__proto__;

    L == O;//true

    终极方法:

    Object.prototype.toString.call(value) ->找到Object原型上的toString方法,让方法执行

    许多引用类型都重写了toString方法,所以借用call或者apply调用原型上的方法

    除了Object上的toString,其他类原型上的toString都是把当前的数据值转换为字符串的意思

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

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

    使用示例:

    var dataType = [{

        '[object Null]' : 'null',

        '[object Undefined]' : 'undefiend',

        '[object Boolean]' : 'boolean',

        '[object Number]' : 'number',

        '[object String]' : 'string',

        '[object Function]' : 'function',

        '[object Array]' : 'array',

        '[object Date]' : 'date',

        '[object RegExp]' : 'regexp',

        '[object Object]' : 'object',

        '[object Error]' : 'error'

    }]

    toString = Object.prototype.toString.call;

    function type(value){

        return  dataType[toString(value)];

    }

    type(1)//'number'

    相关文章

      网友评论

          本文标题:关于js的数据类型检测(最详细解读)

          本文链接:https://www.haomeiwen.com/subject/riajoftx.html