js数据类型判断

一)JS数据类型种类

  1. 基本数据类型:string、number、null、Boolean、undefined共五大类,数据大小确定,储存在计算机栈内存中。
  2. 引用类型:Function、Object、Array三大类,存储在堆内存中(保存的是指针,指向内存地址)。

二)JS数据类型检测方式
主要有typeof、instanceof、constructor、Object.prototype.toString()四种。

  1. typeof检测8大数据类型,null和Array都被检测成了object,其它都正常。
    console.log(typeof 1)  //number
    console.log(typeof 'a') //string
    console.log(typeof true) //boolean
    console.log(typeof undefined) //undefined
    console.log(typeof null) //object
    console.log(typeof []) //object
    console.log(typeof function () { }) //function
    console.log(typeof {}) //object
  1. instanceof(实例),只能检测引用类型(数组,对象,函数),检测引用类型A是否是B的实例,通过原型链检测引用实例的构造函数。
    console.log(1 instanceof Number)  //false
    console.log('a' instanceof String) //false
    console.log(true instanceof Boolean) //false
    // console.log( undefined instanceof undefined) // 异常
    // console.log( null instanceof null) // 异常
    console.log([] instanceof Array) //true
    console.log(function () { } instanceof Function) //true
    console.log({} instanceof Object) //true

	// 这就是instanceof实现原理,通过原型链检测引用实例的构造函数
    // a引用实例,b构造函数
    function instance(a,b){
        let p1 = a.__proto__
        let p2 = b.prototype
        while(true){
            if(p1 === null) return false
            if(p1 === p2 ) return true
            p1 = p1.__proto__
        }
    }
  1. constructor(构造函数)检测数据的构造函数,对象的constructor指向创建该对象的函数,也就是构造函数
    这里首先讲下constructor的用法:
    console.log(''.constructor === String)  // true
    console.log((1).constructor === Number)	// true
   // console.log((null).constructor === null)	// 异常
   // console.log(undefinde.constructor === undefined)	// 异常
   console.log([].constructor === Array) // true
   console.log({}.constructor === Object) // true
   console.log((function () { }).constructor === Function) // true
  • 除null、undefined不能检测其构造函数外,其它都能检测到数据的构造函数。
    function Cat() {
        this.name = 'coco'
        this.say = function (age, sex) {
            console.log('my name is ' + this.name)
        }
    }
    const cat = new Cat()
    // 对象的constructor指向创建该对象的函数,也就是构造函数
    console.log(cat.constructor === Cat)  // true
    console.log(cat.__proto__ === Cat.prototype)
    console.log(cat.__proto__.constructor === Cat) // true
    // 函数的原型对象的constructor指向函数本身
    console.log(Cat.prototype.constructor === Cat)  // true
  • 对象的constructor指向创建该对象的函数,也就是构造函数。

  • 函数的原型对象的constructor指向函数本身。

     constructor的其它用法
    

比喻我们在引用一个构造函数的实例时,我们想对其构造函数进行改造,这时constructor就有用了,我们可以通过实例的constructor找到其构造函数,然后在构造函数的原型对象上添加一些新的属性和方法。

     function Cat() {
        this.name = 'coco'
    }
    const cat = new Cat()
    // 在构造函数Cat上添加age属性,并赋值22
    cat.constructor.prototype.age = 22
    cat.constructor.prototype.say = function(){
    	console.log("my name is "+ this.name+", and age is "+this.age)
   }
    const cat1 = new Cat()
    console.log(cat1.age) // 22
    cat1.say() // my name is coco, and age is 22
    // constructor.length构造函数参数个数
    console.log(cat1.constructor.length) // 0
  1. Object.prototype.toString()
    toString()是Object原型prototype的一个方法,默认返回对象的[Object,XX]
    console.log(Object.prototype.toString())  // [object Object]
    console.log(Object.prototype.toString.call(null)) // [object Null]
    console.log(Object.prototype.toString.call(undefined)) // [object Undefined]
    console.log(Object.prototype.toString.call('')) // [object Object]
    console.log(Object.prototype.toString.call(1)) // [object Number]
    console.log(Object.prototype.toString.call(true)) // [object Boolean]
    console.log(Object.prototype.toString({})) // [object Object]
    console.log(Object.prototype.toString.call([])) // [object Array]
    console.log(Object.prototype.toString.call(function(){})) // [object Object]
  • Object.prototype.toString()可以检测出8大数据类型。
  • 检测object对象时直接调用,检测其它类型需添加call,apply等方法,貌似jq里面判断数据类型就是通过这个方法。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值