明天在我的项目中看到了用Object.prototype.toString.call()这个办法封装的检测数据类型的工具。

然而浏览器搜寻相干原理的好答复百里挑一,故而想记录一下,万一能够帮忙到更多的老手呢?我的文章都是十分通俗易懂的,因为我写文章的时候,都是依据一个前提,如果我是刚开始学习js的老手,他人如果这样解说这个知识点,那么我也能听懂。我不喜爱那种用专业术语去解释一个知识点凸显本人程度高超的文章,所以我通常采纳费曼学习法的形式去记录这些知识点。喜爱的话能够看看我其它文章,对新人极度敌对的哟~


1.我置信大多数人对这个办法有一个误区,包含我,在刚开始学JS的时候,容易对这个办法产生了一个谬误的认知。

比方const a = {name:"韩振方"},如同感觉a.toString办法应该返回字符串类型的{name:"韩振方"}。问题的关键点就恰好在这个中央。

2.首先咱们要晓得toString这个办法,这个函数的返回值原本就应该是上面的固定格局。一个字符串个格局的[object xxxx]xxxx代表着调用这个办法的“数据”的数据类型。

3.重点来了:js其实是重写了某些数据类型的toString办法,所以才会造成上面的状况,在这里咱们拿函数类型举例子,其余数据类型同理:

嗯...对,这才是我现实中的toString,会返回这个变量的字符串显示样子。

4.要想搞明确这个知识点,在这里你必须要对原型链和原型有清晰的意识。咱们晓得,JS的大原型其实是Object构造函数的prototype指向的那个Object,JS的世界的起源就是它。

这个对象上的toString办法才是原汁原味的toString

5.当咱们用delete办法去删除Function.prototype(也就是Function构造函数的原型)身上的toString,而后咱们再次调用name.toString会产生什么呢?

6.然而咱们往往不会用delete去删除,所以就采纳call办法去扭转Object.prototype.toString办法this的指向。

是否豁然开朗了呢?