• 实习打怪之路:JS中检测数据类型的方法


    一.JS中的数据类型:

    1) 简单类型:String、Number、Boolean、Undefined、Null、Symbol
    2)引用(复杂)类型:Object

    二、检测数据类型的方法:

    1、typeof 检测一些基本的数据类型

    语法:typeof 后面加不加括号都是可以用的
    注意:正则、{}、[]、null输出结果为object

    1. //typeof 检测一些基本的数据类型
    2. var a=Symbol();
    3. console.log(typeof a);
    4. console.log(typeof /\d/);//object
    5. console.log(typeof {});//object
    6. console.log(typeof []);//object
    7. console.log(typeof (null));//object
    8. console.log(typeof 123);//number
    9. console.log(typeof true);//boolean
    10. console.log(typeof function () {});//function
    11. console.log(typeof (undefined));//undefined
    12. console.log(typeof NAN)//undefined
    13. console.log(typeof [])//object

    2、A  instanceof   B检测当前实例是否隶属于某各类

    双目运算符 a instanceof b ,判断a的构造器是否为b,返回值为布尔值

    1. //双目运算符 a instanceof b ,判断a的构造器是否为b,返回值为布尔值
    2. function b(){}
    3. let a = new b;
    4. console.log(a instanceof b);//true
    5. console.log(b instanceof Object);//true
    6. let arr = [1,2,3,4];
    7. console.log(arr instanceof Array);//true

    3、constructor构造函数

    语法:实例.constructor
            对象的原型链下(构造函数的原型下)有一个属性,叫constructor
    缺点:**constructor并不可靠,容易被修改(只有参考价值)。即使被修改了,也不会影响代码的正常运行。正常开发的时候,constructor不小心被修改了,为了方便维护,和开发,可以手动更正constructor的指向。

    1. //constructor构造函数
    2. function b() {}
    3. let a = new b;
    4. let c=new Array();
    5. console.log(a.constructor.name);//b
    6. console.log(c.constructor)//[Function: Array]
    7. console.log(b.constructor);//Function(){}
    8. console.log(Function.constructor);//Function(){}

    小知识

    4、hasOwnporperty 检测当前属性是否为对象的私有属性

    语法: obj.hasOwnporperty(“属性名(K值)”)

    1. // hasOwnporperty检测当前属性是否为对象的私有属性
    2. let obj = {
    3. name:"lxw"
    4. };
    5. console.log(obj.hasOwnProperty('name'));//true
    6. console.log(obj.hasOwnProperty('lxw'));//false

     5、is Array 判断是否为数组

    1. // 5、is Array 判断是否为数组
    2. console.log(Array.isArray([]));//true
    3. console.log(Array.isArray(new Array()));//true

    6、valueOf

    可以看到数据最本质内容(原始值)

    1. //valueOf
    2. let a = "12345";
    3. let b= new String('12345');
    4. console.log(typeof a);//string
    5. console.log(typeof b);//object
    6. console.log(a == b);//true (typeof检测出来是对象居然和一个字符串相等,显然b并不是一个真的对象。)
    7. //此时看看 valueOf()的表现
    8. console.log(b.valueOf());//12345 拿到b的原始值是 字符串的12345
    9. console.log(typeof b.valueOf())//string 这才是 b的真正的数据类型

     

    1.Math是个对象,不是类。类才有prototype(原型)。也就是说类都有原型:prototype,对象都有原型链:proto,函数既是类,也是对象,也是函数。
    2.如何把对象转换成字符串
     对象下的toString方法是检测数据类型的,而不是用来转化成字符串的,这时可以用JSON的方法来转化

    1. let obj={name:'朱军林'}
    2. console.log(obj.toString())//=>"[object Object]"
    3. console.log(JSON.stringify({name:'朱军林'}))//"{"name":"朱军林"}"

     

    7、Object.portotype.toString (最好的)
    语法:Object.prototype.toString.call([value])
            获取Object.portotype上的toString方法,让方法的this变为需要检测的数据类型值,并且让这个方法执行

    在Number、String、Boolean、Array、Function、RegExp…这些类的原型上都有一个toString方法:这个方法就是把本身的值转化为字符串

    1. (123).toString()//'123'
    2. (true).toString()//'true'
    3. [12,23].toString()//'12.23'

    在Object这个类的原型上也有一个方法toString,但是这个方法并不是把值转换成字符串,而是返回当前值得所属类详细信息,固定结构:’[object 所属的类]'

    调取的正是Object.prototype.toString方法obj.toString()
    首先执行Object.prototype.tostring方法,这个方法中的this就是我们操作的数据值obj


    总结:Object.prototype.toString执行的时候返回当前方法中的this的所属类信息,也就是,我想知道谁的所属类信息,我们就把这个toString方法执行,并且让this变为我们检测的这个数据值,那么方法返回的结果就是当前检测这个值得所属类信息 

    1. Object.prototype.toString.call(12)//[boject Number]
    2. Object.prototype.toString.call(true)//[boject Boolean]
    3. //"[object Number]"
    4. //"[object String]"
    5. //"[object Object]"
    6. //"[object Function]"
    7. //"[object Undefined]"
    8. //"[object Null]"
    9. //"[object RegExp]"
    10. //"[object Boolean]"

    Object.prototype.toString.call()

    这个方法是用来判断数据类型的,主要用到的知识点是原型,原型链

    1. 每个对象都有一个 toString() 方法,当该对象被表示为一个文本值时,或者一个对象以预期的字符串方式引用时自动调用。
    2. 默认情况下,toString() 方法被每个 Object 对象继承。如果此方法在自定义对象中未被覆盖,toString() 返回 "[object type]"
    3. 其中 type 是对象的类型。

     

    如果把Array里面的toString方法删除

    再调用toString()

     输出这个的原因,是因为,Array里面的toString被删除掉,此时Array的toString,是继承自Object里面的toString。 所以此时可以判断数据类型。所以判断数据类型,直接用对象上面的Object.prototype.toString来判断数据类型

    一个数组,调用了toString。返回了字符串 ,这是正常预期,为什么呢,因为Array和Object里都有toString() ,根据原型链的就近原则,会先取Array.prototype,
    此时我们如果删除Array里面的toString
    先检测Array里 有没有toString ,

     

     此时,会发现,明明放进去的是数组,怎么返回了对象类型,因为Object.prototype 本身是对象类型,所以返回了对象类型,要是想判断传入值的类型,需要把传入值的this,指向Object.prototype ,才能判断传入值的类型

     

    总结

    1.toString为Object的原型方法,而Array 、Function等类型作为Object的实例,都重写了toString方法。

    2.不同的对象类型调用toString方法时,根据原型链的知识,
    调用的是对应的重写之后的toString方法(Function类型返回内容为函数体的字符串,Array类型返回元素组成的字符串…),而不会去调用Object上原型toString方法(返回对象的具体类型),

    3.所以采用obj.toString()不能得到其对象类型,只能将obj转换为字符串类型;
    因此,在想要得到对象的具体类型时,应该调用Object上原型toString方法。

    4.Object对象本身就有一个toString()方法,返回的是当前对象的字符串形式,原型上的toString()返回的才是我们真正需要的包含对象数据类型的字符串。.

    5.为什么需要call?
    由于Object.prototype.toString()本身允许被修改,像Array、Boolean、Number的toString就被重写过,所以需要调用Object.prototype.toString.call(arg)来判断arg的类型,call将arg的上下文指向Object,所以arg执行了Object的toString方法。

    至于call,就是改变对象的this指向,当一个对象想调用另一个对象的方法,可以通过call或者apply改变其this指向,将其this指向拥有此方法的对象,就可以调用该方法了

    原文链接:https://blog.csdn.net/qq_38845858/article/details/124344500

     

  • 相关阅读:
    Stream流
    ARFoundation入门1.0 什么是AR
    【MYSQL】数据类型
    Linux|超好用!绘制流程图神器——PlantUML
    Taurus.MVC 微服务框架 入门开发教程:项目集成:3、客户端:其它编程语言项目集成:Java集成应用中心。
    链表反转类算法题
    面试必问——什么是BFC问题
    2019银川F,ccpc威海D - Sternhalma 2022
    【08】基础知识:React中收集表单数据(非受控组件和受控组件)
    【概率论】关于为什么样本标准偏差分母是n-1的进一步理解
  • 原文地址:https://blog.csdn.net/qq_51066068/article/details/125912652