• TS查漏补缺【类型守卫】


    为什么要用类型守卫?

    类型守卫定义:在语句的块级作用域【if语句内或三目运算符表达式内】缩小变量的一种类型推断行为

    类型守卫产生时机:TS条件语句中遇到下列条件关键字时,会在语句中的会计作用域内缩小变量的类型,这种类型推断的行为称作类型守卫(Tyoe Guard),类型守卫可以帮助我们在块级作用域缩小更为需要的精确的变量类型,从而减少不必要的类型断言

    • 类型判断:typeof
    • 属性或者方法或者函数判断:in
    • 实例判断:instanceog
    • 字面量相等判判断:==,===,!=,!==

    new 实例的底层发生了什么?

    共分为三个步骤,参见如下栗子:

    1. function Person (phone, age) {
    2. this.phone = phone
    3. this.age = age
    4. this.showOne = function () { }
    5. }
    6. Person.prototype.doEat = function () {
    7. console.log(this.phone);
    8. }
    9. let person = new Person("132", 23)
    10. console.log(typeof person);
    11. // new一个实例对象的三步
    12. // 第一步:创建一个Object对象
    13. // var obj = new Object();
    14. var obj = {}
    15. // 第二步:让新创建的对象的__proto__指向Person的原型对象空间
    16. obj.__proto__ = Person.prototype
    17. // 第三步:借用Person构造函数中的obj对象增加属性
    18. Person.apply(obj, ["2123465", 18])
    19. console.log(obj);

    typeof有何局限性?如何解决?

    typeof 作用:typeof用来检测一个变量或一个对象的数据类型。
    typeof检测的范围:
    typeof检测变量的类型范围包括: “string" | "number" / "bigint" / "boolean" | "symbol[ "undefined""obiect" "function”等数据类型。

    typeof 的局限性
    typeof检测变量并不完全准确,例如 typeof null结果为object,这其实设计者的一个bug,但后来一直没有被改过来,于是就此传下来了,但把 null当成 object 的理由说成是未来可能会拥有一个对象空间,这个理由很牵强【我们检测的是对象变量此刻的类型】,null 本来即是数据类型,也是值。所以typeof null直接显示null最合适了。
    再例如:使用typeof来检测一个数组变量,typeof []结果显示的是object,从Array创建的本质上来说确实是object,正如我们在2-29-1中所讲,但开发者期待看到的是Array,这更符合预期。Array和我们定义的普通函数一样,具有双重性,当成函数类型时用来创建数组对象,但也是一个构造函数对象,拥有静态成员和prototype原型对象属性。【这一点我们在TS继承课题已经讲过】
    再比如:使用typeof来检测一个Set变量,Map变量,结果显示的是依然是object.。
     

     typeof的替代方案
    Object.prototype.toString.call
    object.prototype.toString.call ([])展示

    [ object Array ]object.prototype.toString.call(null)展示[ object null ]
    object.prototype.toString.call(Set类型的变量)展示[ object Set ]object.prototype.toString.call(Map类型的变量)展示[ object Map ]

    typeof 的替代方案依然无法解决的问题
    就是无法获取一个自定义的类的实例变量或构造函数的对象变量的真正创建类型,答案是使用instanceof 来解

     instanceof格式:

    对象变量instanceof 类名或函数名
    instanceof 的主要作用: instanceof帮助我们准确的判断一种自定义函数或类创建的对象变量的数据类型。instanceof 执行后返回true的几种条件【符合一个即可】:
    (1)对象变量.proto=类名或函数名.prototype。
    解释1:如果instanceof 关键字左边对象变量的proto属性指向的原型对象空间=右边类名或函数名的prototype对象属性指向的原型对象空间,那么返回true。
    (2)对象变量.proto.proto.._proto_=类名或函数名.prototype。
    解释2: instanceof 左边对象变量proto的1到多个上一级proto指向的原型对象空间,等于右边类名或函数名的prototype对象属性指向的原型对象空间,那么也返回true,按照这个查找规律,会一直找到
    Object.prototype对象属性指向的原型对象空间为止。

  • 相关阅读:
    Redis_三种集群模式
    【数据可视化】免费开源BI工具 DataEase 之 Tab 组件前世今生
    洛谷刷题C语言:远古档案馆(Ancient Archive)、VOLIM、SAHOVNICA、Tuna、KRIŽALJKA
    球谐函数原理
    初始化成员列表
    使用 WebGL 为 HTML5 游戏创建逼真的地形
    乐趣国学—品读《弟子规》中的“亲仁”之道
    10. 元组、集合
    道可云元宇宙每日资讯|上海旅游节将打造数字文旅新场景
    Android Jetpack-Compose相关
  • 原文地址:https://blog.csdn.net/Flying____fish/article/details/127718524