JavaScript数据类型检测

2018-12-20  本文已影响23人  感觉不错哦
先列举一下JavaScript中的基本数据类型

1、基本数据类型(6种)

Undefined
Null
Boolean
Number
String
Symbol  (ES6新增) 符号类型

2、引用数据类型: Object

typeof基本数据类型检测

我们常说typeof是基本数据类型检测,因为typeof无法检测引用数据类型,所有的引用类型都返回Object
在实际运用中,typeof的实际场景往往是用来检测一个对象是否被定义或者赋值,而不是用来检测数据类型

var a,b=10,c='',d={}
alert(typeof a) //undefined
alert(typeof b) //number
alert(typeof c) //string
alert(typeof d) //object

需要注意的是 typeof 返回的是字符串

alert(typeof typeof d) //string

instanceof引用数据类型检测

instanceof 左操作数是一个类,右操作数是标识对象的类。如果左侧的对象是右侧类的实例,则返回true.而js中对象的类是通过初始化它们的构造函数来定义的。即instanceof的右操作数应当是一个函数。所有的对象都是object的实例。如果左操作数不是对象,则返回false,如果右操作数不是函数,则抛出typeError。简单来讲instanceof 运算符用来检测constructor.prototype 是否存在于参数 object 的原型链上

 var arr=[1,2,3]
 var obj={a:1}
 var reg=/\d+/
 console.log(arr instanceof Array,obj instanceof Object,reg instanceof RegExp) //true true true

只对引用类型有效

 var a=10
 console.log(a instanceof Number) //false

稍微扩展一下用法,不深入

        // 定义构造函数
        function C(){} 
        function D(){} 

        var o = new C();

        o instanceof C; // true,因为 Object.getPrototypeOf(o) === C.prototype

        o instanceof D; // false,因为 D.prototype不在o的原型链上

        o instanceof Object; // true,因为Object.prototype.isPrototypeOf(o)返回true
        C.prototype instanceof Object // true,同上

        C.prototype = {};
        var o2 = new C();

        o2 instanceof C; // true

        o instanceof C; // false,C.prototype指向了一个空对象,这个空对象不在o的原型链上.

        D.prototype = new C(); // 继承
        var o3 = new D();
        o3 instanceof D; // true
        o3 instanceof C; // true 因为C.prototype现在在o3的原型链上

就一个要素,看原型链 左边的是否在右边的原型链上

看过我之前文章的小伙伴可能会理解下面为什么?如果看不懂没关系,一般用不上。Object._proto_=>null 也可以理解这里没有null

        function Person() {}
        console.log(Object instanceof Object);     //true
        //第一个Object的原型链:Object=>
        //Object.__proto__ => Function.prototype=>Function.prototype.__proto__=>Object.prototype
        //第二个Object的原型:Object=> Object.prototype

        console.log(Function instanceof Function); //true
        //第一个Function的原型链:Function=>Function.__proto__ => Function.prototype
        //第二个Function的原型:Function=>Function.prototype

        console.log(Function instanceof Object);   //true
        //Function=>
        //Function.__proto__=>Function.prototype=>Function.prototype.__proto__=>Object.prototype
        //Object => Object.prototype

        console.log(Person instanceof Function);      //true
        //Person=>Person.__proto__=>Function.prototype
        //Function=>Function.prototype

        console.log(String instanceof String);   //false
        //第一个String的原型链:String=>
        //String.__proto__=>Function.prototype=>Function.prototype.__proto__=>Object.prototype
        //第二个String的原型链:String=>String.prototype

        console.log(Boolean instanceof Boolean); //false
        //第一个Boolean的原型链:Boolean=>
        //Boolean.__proto__=>Function.prototype=>Function.prototype.__proto__=>Object.prototype
        //第二个Boolean的原型链:Boolean=>Boolean.prototype

        console.log(Person instanceof Person); //false
        //第一个Person的原型链:Person=>
        //Person.__proto__=>Function.prototype=>Function.prototype.__proto__=>Object.prototype
        //第二个Person的原型链:Person=>Person.prototype

[[class]]类属性

之前我在对象深入中介绍过此属性,看过的小伙伴不知道还有没有印象

对象的类属性是个字符串,用来表示对象的类型信息,然而ES3与ES5都未设置这个属性的方法,有一种间接的方法可以查询到它

     function classof(obj){
        
        return Object.prototype.toString.call(obj)
    }
    console.log(classof(null)) //Null
    console.log(classof(1)) //Number
    console.log(classof("")) //String
    console.log(classof(false)) //Boolean
    console.log(classof(/./))  //RegExp
    console.log(classof(undefined))  //Undefined

此方法是最好的判断方法

上一篇下一篇

猜你喜欢

热点阅读