js数据类型判断

    技术2022-07-10  120

    一)JS数据类型种类

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

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

    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 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__ } } 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 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里面判断数据类型就是通过这个方法。
    Processed: 0.008, SQL: 9