zoukankan      html  css  js  c++  java
  • 判断某个对象属于哪种数据类型

    type   instanceof   Object.prototype.toString.call

    type

    
    

    在 JavaScript 里使用 typeof 来判断数据类型,只能区分基本类型,即 “number”,”string”,”undefined”,”boolean”,”object” 五种。

    
    

    对于数组、函数、对象来说,其关系错综复杂,使用 typeof 都会统一返回 “object” 字符串。

    instanceof

    复制代码
    var a = {};
    var b = [];
    var c = function () {};
    
    //a b c 都是 Object 的实例
    console.log(a instanceof Object) //true
    console.log(b instanceof Object) //true
    console.log(c instanceof Object) //true
    
    //只有 Array 类型的 b 才是 Array 的实例
    console.log(a instanceof Array) //false
    console.log(b instanceof Array) //true
    console.log(c instanceof Array) //false
    
    //只有 Function 类型的 c 才是 Function 的实例
    console.log(a instanceof Function) //false
    console.log(b instanceof Function) //false
    console.log(c instanceof Function) //true
    复制代码

    Object.prototype.toString.call()

    复制代码
    console.log(Object.prototype.toString.call(123)) //[object Number]
    console.log(Object.prototype.toString.call('123')) //[object String]

    console.log(Object.prototype.toString.call(undefined)) //[object Undefined]

    console.log(Object.prototype.toString.call(true)) //[object Boolean]

    console.log(Object.prototype.toString.call({})) //[object Object]

    console.log(Object.prototype.toString.call([])) //[object Array]
    console.log(Object.prototype.toString.call(function(){})) //[object Function]
    复制代码

    为什么必须用Object.prototype.toStirng.call而不能直接用toString这个方法

    复制代码
    toString为Object的原型方法,而Array ,function等类型作为Object的实例,都重写了toString方法。

    不同的对象类型调用toString方法时,根据原型链的知识,调用的是对应的重写之后的toString方法(function类型返回内容为函数体的字符串,Array类型返回元素组成的字符串.....),而不会去调用Object上原型toString方法(返回对象的具体类型),所以采用obj.toString()不能得到其对象类型,只能将obj转换为字符串类型;因此,在想要得到对象的具体类型时,应该调用Object上原型toString方法。


    验证:
      

    var arr=[1,2,3];

    console.log(Array.prototype.hasOwnProperty("toString"));//true

    console.log(arr.toString());//1,2,3

    delete Array.prototype.toString;//delete操作符可以删除实例属性

    console.log(Array.prototype.hasOwnProperty("toString"));//false

    console.log(arr.toString());//"[object Array]"

    删除了Array的toString方法后,同样再采用arr.toString()方法调用时,不再有屏蔽Object原型方法的实例方法,因此沿着原型链,arr最后调用了Object的toString方法,返回了和Object.prototype.toString.call(arr)相同的结果。

  • 相关阅读:
    【逆向】《0day安全-软件漏洞分析技术》实验笔记2
    【逆向】《0day安全-软件漏洞分析技术》实验笔记1
    WorkWithPlus 13.15 升级!列表对象的优化效果显著!
    「版本更新」Genexus 16 Upgrade 9已发布!
    下一波数字化转型来临,我们需要选择更智能的开发工具
    太棒!企业和程序员都高兴!2-3个月打造全栈工程师
    GeneXus中如何使用聊天机器人
    「版本更新」GeneXus16 Upgrade 8的特性
    看完视频我终于明白:资深架构师角度的技术架构是这样!
    数据报告和分析:Dashboard
  • 原文地址:https://www.cnblogs.com/yaoyao-/p/10894180.html
Copyright © 2011-2022 走看看