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

2018-10-15  本文已影响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'

上一篇下一篇

猜你喜欢

热点阅读