经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JSJS库框架 » JavaScript » 查看文章
用Object.prototype.toString.call(obj)检测对象类型原因分析
来源:jb51  时间:2018/10/12 9:22:56  对本文有异议

这是一个十分常见的问题,用 typeof 是否能准确判断一个对象变量,答案是否定的,null 的结果也是 object,Array 的结果也是 object,有时候我们需要的是 "纯粹" 的 object 对象。如何避免呢?比较好的方式是:

  1. console.log(Object.prototype.toString.call(obj) === "[object Object]");

使用以上方式可以很好的区分各种类型:

(无法区分自定义对象类型,自定义类型可以采用instanceof区分)

  1. console.log(Object.prototype.toString.call("jerry"));//[object String]
  2. console.log(Object.prototype.toString.call(12));//[object Number]
  3. console.log(Object.prototype.toString.call(true));//[object Boolean]
  4. console.log(Object.prototype.toString.call(undefined));//[object Undefined]
  5. console.log(Object.prototype.toString.call(null));//[object Null]
  6. console.log(Object.prototype.toString.call({name: "jerry"}));//[object Object]
  7. console.log(Object.prototype.toString.call(function(){}));//[object Function]
  8. console.log(Object.prototype.toString.call([]));//[object Array]
  9. console.log(Object.prototype.toString.call(new Date));//[object Date]
  10. console.log(Object.prototype.toString.call(/\d/));//[object RegExp]
  11. function Person(){};
  12. console.log(Object.prototype.toString.call(new Person));//[object Object]

为什么这样就能区分呢?于是我去看了一下toString方法的用法:toString方法返回反映这个对象的字符串。

那为什么不直接用obj.toString()呢?

  1. console.log("jerry".toString());//jerry
  2. console.log((1).toString());//1
  3. console.log([1,2].toString());//1,2
  4. console.log(new Date().toString());//Wed Dec 21 2016 20:35:48 GMT+0800 (中国标准时间)
  5. console.log(function(){}.toString());//function (){}
  6. console.log(null.toString());//error
  7. console.log(undefined.toString());//error

同样是检测对象obj调用toString方法(关于toString()方法的用法的可以参考toString的详解),obj.toString()的结果和Object.prototype.toString.call(obj)的结果不一样,这是为什么?

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

我们可以验证一下,将数组的toString方法删除,看看会是什么结果:

  1. var arr=[1,2,3];console.log(Array.prototype.hasOwnProperty("toString"));//true
  2. console.log(arr.toString());//1,2,3
  3. delete Array.prototype.toString;//delete操作符可以删除实例属性
  4. console.log(Array.prototype.hasOwnProperty("toString"));//false
  5. console.log(arr.toString());//"[object Array]"

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

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号