美文网首页
类型判断

类型判断

作者: 逆风飘游的鱼 | 来源:发表于2021-01-11 14:55 被阅读0次

    typeof操作符

    typeof返回一个表示数据类型的字符串,返回结果包括:number、string、boolean、undefined、symbol、object、function等7种数据类型,但不能判断null、array等

    第一点:当操作数为null时。typeof  null;// object

    第二点:当操作数为原始类型(Primitive)时很有效,但是对于对象具体类型的判断往往并不是我们需要的结果。

    typeof 6大原始类型Null、Undefined、String、Number、Boolean和Symbol。正确

    typeof '123';// string

    typeof newString('123');// object

    instanceof操作符

    instanceof 是用来判断A是否为B的实例,表达式为:A instanceof B,如果A是B的实例,则返回true,否则返回false。instanceof 运算符用来测试一个对象在其原型链中是否存在一个构造函数的 prototype 属性,但它不能检测null 和 undefined

    instanceof操作符主要用来检查构造函数的原型是否在对象的原型链上。

    consts =newString('123');  s instanceof String;// truesinstanceofObject;// true复制代码

    接下来让我们搞点事情:

    s.__proto__ =Object.prototype;  sinstanceofString;// falsesinstanceofObject;// true复制代码

    利用instanceof操作符,我们可以对自定义的对象进行判断:

    functionAnimal(name){this.name = name  }constfizz =newAnimal('fizz');  fizzinstanceofAnimal// true复制代码

    constructor属性

    constructor作用和instanceof非常相似。但constructor检测 Object与instanceof不一样,还可以处理基本数据类型的检测。

    不过函数的 constructor 是不稳定的,这个主要体现在把类的原型进行重写,在重写的过程中很有可能出现把之前的constructor给覆盖了,这样检测出来的结果就是不准确的。

    实际上我们也可以通过constructor属性来达到类型判断的效果:

    fizz.constructor === Animal// true复制代码

    但是在实际情况下,constructor属性可以被随意修改,而且你在原型继承中,很容易忽略掉constructor的正确指向:

    从好的编程习惯来说,我们应该要保持constructor属性的正确指向。

    Object.prototype.toString.call()

    Object.prototype.toString.call() 是最准确最常用的方式。利用toString方法基本上可以解决所有内置对象类型的判断:

    functiontype(obj){returnReflect.apply(Object.prototype.toString, obj, []).replace(/^\[object\s(\w+)\]$/,'$1').toLowerCase()  }    type(newString('123'))// string复制代码

    但是这种方法对于自定义的构造函数仍然无效。

    相关文章

      网友评论

          本文标题:类型判断

          本文链接:https://www.haomeiwen.com/subject/smxxyctx.html