zoukankan      html  css  js  c++  java
  • 数据类型的检测

    typeof

    最常用的一种

    console.log(typeof 1)           //'number'
    console.log(typeof '1')         //'string'
    console.log(typeof undefined)   //'undefined'
    console.log(typeof true)        //'boolean'
    console.log(typeof Symbol())    //'symbol'
    console.log(typeof null)        //'object'
    console.log(typeof [])          //'object'
    console.log(typeof {})          //'object'
    console.log(typeof console)     //'object'
    console.log(typeof console.log) //'function'

    前6个为基本类型。

    null的typeof为object可以理解为js的一个bug,不代表null为引用类型,null本身也不是对象。判断null的方法,可以直接通过 === null。

    引用类型使用typeof判断的话,除了function可以判断出来,其余都是'object',是无法准确判断的。

    instanceof

    原型链查找

    let Person = function () { }
    const p1 = new Person()
    console.log(p1 instanceof Person)   //true

    手写instanceof原理代码

    function myInstanceof(left, right) {
        //基础类型直接返回false
        if (typeof left !== 'object' || left === null) return false
    
        let proto = Object.getPrototypeOf(left)
        while (true) {
            if (proto === null) return false
            if (proto === right.prototype) return true
            proto = Object.getPrototypeOf(proto)
        }
    }
    
    myInstanceof([], Array) //true

    Object.prototype.toString

    统一返回格式为'[object Xxx]'的字符串。其中Xxx(首字母是大写,typeof是小写)就是对象的类型。

    对于Object对象,直接调用toString。其他对象,需要通过call调用。

    console.log(Object.prototype.toString({}))                      //'[object Object]'
    console.log(Object.prototype.toString.call({}))                 //结果同上,加了call
    console.log(Object.prototype.toString.call(1))                  //'[object Number]'
    console.log(Object.prototype.toString.call('1'))                //'[object String]'
    console.log(Object.prototype.toString.call(true))               //'[object Boolean]'
    console.log(Object.prototype.toString.call(undefined))          //'[object Undefined]'
    console.log(Object.prototype.toString.call(null))               //'[object Null]'
    console.log(Object.prototype.toString.call(function () { }))    //'[object Function]'
    console.log(Object.prototype.toString.call(new Date()))         //'[object Date]'
    console.log(Object.prototype.toString.call(/123/g))             //'[object RegExp]'
    console.log(Object.prototype.toString.call([]))                 //'[object Array]'
    console.log(Object.prototype.toString.call(document))           //'[object HTMLDocument]'
    console.log(Object.prototype.toString.call(window))             //'[object Window]'

    实现全局通用的数据类型判断方法

    function getType(obj) {
        let type = typeof obj
        if (type !== 'object') {
            return type
        }
        return Object.prototype.toString.call(obj).replace(/^[object (S+)]$/, '$1').toLowerCase()
    }
    
    console.log(getType([]))    //'array'

    相关:判断数组的方法

  • 相关阅读:
    PHP面向对象魔术方法基本了解
    PHP面向对象访问修饰符的基本了解
    php析构函数小结
    php构造方法(函数)基础
    php面向对象成员方法(函数)练习
    php面向对象的初认识
    用JS把数组内的日期转换为星期
    JavaScript事件(随笔)
    Spring框架的核心功能之AOP技术
    Spring框架 IOC注解
  • 原文地址:https://www.cnblogs.com/lianglanlan/p/15029391.html
Copyright © 2011-2022 走看看