这几天看vue-router的源码 发现了Object.prototype.toString.call()这样的用法,当时以为这就是转成字符串的用的,但是越看越觉得不太对劲,赶紧查查资料,一查才知道没那么简单.

首先在Object.prototype.toString方法被调用时,会执行下面的操作步骤:

1. 获取this对象的[[Class]]属性的值.

2. 计算出三个字符串"[object ", 第一步的操作结果Result(1), 以及 "]"连接后的新字符串.

3. 返回第二步的操作结果Result(2).

[[Class]]是一个内部属性,所有的对象(原生对象和宿主对象)都拥有该属性.在规范中,[[Class]]是这么定义的

内部属性 描述
[[Class]] 一个字符串值,表明了该对象的类型.

看这里重点: [[Class]] 表明了该对象的类型

而且除了通过Object.prototype.toString方法之外,没有提供任何其他方式来让程序访问该属性的值. 看到这里我就想到了 Object.prototype.toString 是不是可以用来检测对象的类型,而且vue-router源码里面正好就是用来检测对象类型的.

等等 隐约记得 typeof 和 instanceof 也是用来检测类型的  后来查阅资料


typeof 只能区分基本类型,即 “number”,”string”,”undefined”,”boolean”,”object” 五种。

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


instanceof

可以检测自定义类型 但是检测的必须是对象( Object ).  比如如果想检测 a是什么类型  要先检测他是否是Object 类型 然后才能用instanceof , 这就麻烦了.


而Object.prototype.toString就没有这么多限制.

[[Class]]属性的值可以是除了 "Array", "Boolean", "Date", "Error", "Function", "JSON", "Math", "Number", "Object", "RegExp", "String"之外的的任何字符串

看下面的例子

下面是实战:

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]
console.log(Object.prototype.toString.call(null)) //[object Null 什么类型都可以,完美.

最后加个 toString()的知识点 直接看演示:

如果不带括号 直接对 1 使用 toStirng()的时候   会把.当做小数点 然后报错   所以应该使用 1..toString();

Object.prototype.toString.call(obj)使用方法以及原理的更多相关文章

  1. 为什么用Object.prototype.toString.call(obj)检测对象类型?

    最近做了做一些js面试25 Essential JavaScript Interview Questions*,其中第一道是:使用typeof bar === "object"检测 ...

  2. Object.prototype.toString.call(obj)检测数据类型

    typeof bar=='object' 不能确切判断数据是一个‘纯粹’的对象 Array null的结果都是object 比较好的方法是: Object.prototype.toString.cal ...

  3. 用Object.prototype.toString.call(obj)检测对象类型原因分析

    用Object.prototype.toString.call(obj)检测对象类型原因分析  更新时间:2018年10月11日 08:46:33   投稿:laozhang    我要评论   在本 ...

  4. Object.prototype.toString.call(obj).slice(8,-1)

    1.Object.prototype.toString() 该方法返回描述某个对象数据类型的字符串,如自定义的对象没有被覆盖,则会返回“[object type]”,其中,type则是实际的对象类型. ...

  5. 数据类型的判断 --Object.prototype.toString.call(obj)精准检测对象类型

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

  6. js Object.prototype.toString.call()

    Object.prototype.toString.call(obj)使用方法以及原理   这几天看vue-router的源码 发现了Object.prototype.toString.call()这 ...

  7. 从toString()方法到Object.prototype.toString.call()方法

    一.toString方法和Object.prototype.toSting.call()的区别 var arr=[1,2]; 直接对一个数组调用toString()方法, console.log(ar ...

  8. instanceof, typeof, & Object.prototype.toString

    /** * * @authors Your Name (you@example.org) * @date 2016-11-18 09:31:23 * @version $Id$ */instanceo ...

  9. 图形验证码知识点整理 Object.prototype.toString.call()等

    使用typeof bar === "object"检测”bar”是否为对象有什么缺点?如何避免?这是一个十分常见的问题,用 typeof 是否能准确判断一个对象变量,答案是否定的, ...

随机推荐

  1. 使用Bootatrap的心得

    使用Bootatrap的心得: 更新中... 在使用过一端时间的Bootstrap之后, 发现自己进入了使用误区,本来人家就为你提供好了样式丰富的各种样式,容器.但是我却在一边使用人家的样式,一边自己 ...

  2. jsp页面集成xhEditor文本编辑器

    经常写博客的都应该接触文本编辑器,现在大多数都是使用Markdown,Markdown是一种可以使用普通文本编辑器编写的标记语言,在文章中通过简单的语法标记就可以实现文字的不同格式,对于Markdow ...

  3. Angular开发实践(四):组件之间的交互

    在Angular应用开发中,组件可以说是随处可见的.本篇文章将介绍几种常见的组件通讯场景,也就是让两个或多个组件之间交互的方法. 根据数据的传递方向,分为父组件向子组件传递.子组件向父组件传递及通过服 ...

  4. python全栈开发-Day2 布尔、流程控制、循环

    python全栈开发-Day2 布尔 流程控制 循环   一.布尔 1.概述 #布尔值,一个True一个False #计算机俗称电脑,即我们编写程序让计算机运行时,应该是让计算机无限接近人脑,或者说人 ...

  5. Maven-07: 插件的自定义绑定

    除了内置绑定以外,用户还能够自己选择将某个插件目标绑定到生命周期的某个阶段上,这种自定义绑定方式能让Maven项目在构建过程中执行更多更富特色的任务. 一个常见的例子是创建项目的源码jar包.内置的插 ...

  6. hibernate框架学习笔记1:搭建与测试

    hibernate框架属于dao层,类似dbutils的作用,是一款ORM(对象关系映射)操作 使用hibernate框架好处是:操作数据库不需要写SQL语句,使用面向对象的方式完成 这里使用ecli ...

  7. 网络1712--c语言第二次作业总结

    1.作业亮点 1.1在调试问题方面有明显进步,变量声明方面有所改变,没有发现大面积抄袭现象. 1.2 以下几位同学博文写的较为优秀,可作为范例供大家参考 田亚琴--代码格式良好,思路清晰,调试部分图文 ...

  8. C语言作业--函数

    一.PTA实验作业 题目1: 400-499 中4出现的次数 1. 本题PTA提交列表 2. 设计思路 一.main函数 1.函数声明int fun(int x) 2.定义变量i,k,i表示输入的值, ...

  9. C语言结构体作业

    一.PTA实验作业 题目1:6-3 结构体数组中查找指定编号人员 1. 本题PTA提交列表 2. 设计思路 定义一个结构体指针*p for i=0 to i=7 如果std+i的编号与输入的编号一样 ...

  10. 敏捷开发每日报告--day4

    1 团队介绍 团队组成: PM:齐爽爽(258) 小组成员:马帅(248),何健(267),蔡凯峰(285)  Git链接:https://github.com/WHUSE2017/C-team 2 ...