Object.prototype.toString.call()的原理

迭代苔原
• 阅读 924

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

但是浏览器搜索相关原理的好回答凤毛麟角,故而想记录一下,万一可以帮助到更多的新手呢?我的文章都是非常通俗易懂的,因为我写文章的时候,都是根据一个前提,假如我是刚开始学习js的新手,别人如果这样讲解这个知识点,那么我也能听懂。我不喜欢那种用专业术语去解释一个知识点凸显自己水平高超的文章,所以我通常采用费曼学习法的方式去记录这些知识点。喜欢的话可以看看我其它文章,对新人极度友好的哟~😊


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

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

2.首先我们要知道toString这个方法,这个函数的返回值本来就应该是下面的固定格式。一个字符串个格式的[object xxxx]xxxx代表着调用这个方法的“数据”的数据类型。

Object.prototype.toString.call()的原理

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

Object.prototype.toString.call()的原理

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

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

Object.prototype.toString.call()的原理

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

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

Object.prototype.toString.call()的原理

6.但是我们往往不会用delete去删除,所以就采用call方法去改变Object.prototype.toString方法this的指向。

Object.prototype.toString.call()的原理

是否恍然大悟了呢?

点赞
收藏
评论区
推荐文章
待兔 待兔
1年前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
秃头王路飞 秃头王路飞
3年前
JS数据类型检测
数据类型检测相信大家有的时候判断数据类型的时候会有疑惑1、typeof、instanceof用的话会有哪些缺陷呢?2、哪个api只要记住的话,就可以完美判断呢?1、typeof返回的都是字符串jstypeofSymbol()'symbol'typeofnull'object'typeof'object'typeof'ob
Easter79 Easter79
4年前
sql中join的理解
前言为什么会突然写这个blog呢?因为之前有只青蛙小姐姐问我,能不能教她join,当时上大学老师怎么教她也不会。然后本来想面对面交流给她说明,后面阴错阳差,就延误到了现在。所以我想,我可以提前准备好我想说的东西,记录下来,顺便自己也回忆下join(ps:为什么我需要回忆?因为之前的公司都是面向互联网的、高并发的业务,用join的话,很容易导致数
Karen110 Karen110
4年前
​一篇文章总结一下Python库中关于时间的常见操作
前言本次来总结一下关于Python时间的相关操作,有一个有趣的问题。如果你的业务用不到时间相关的操作,你的业务基本上会一直用不到。但是如果你的业务一旦用到了时间操作,你就会发现,淦,到处都是时间操作。。。所以思来想去,还是总结一下吧,本次会采用类型注解方式。time包importtime时间戳从1970年1月1日00:00:00标准时区诞生到现在
Easter79 Easter79
4年前
Springboot集成flowable modeler web流程设计器
之前画流程图都是用tomcat启动flowablemodeler,但是这样启动就不能在分配任务用户/用户组的时候查询自己系统里的数据。所以现在需要把flowablemodeler集成到项目里来。之前自己也搜索了很多文章,都感觉不是很清晰,可能也是因为我刚接触不久。现在自己集成好了之后,记录一下自己学习的结果。1.首先需要创建一个springb
Wesley13 Wesley13
4年前
JS中二进制与十进制的相互转换
今天在做题目的时候遇到了需要十进制转换为二进制,这个我知道用toString可以,但是二进制转换为十进制我一下子就想不起来,网上搜了下,才知道是parseInt可以实现,特此记录下。十进制转换为二进制:varnum100;console.log(num.toString(2));toString()方法可把一个
Stella981 Stella981
4年前
Jetbrains Idea 内 CoffeeScript 的 mocha 单元测试的配置
都9012年了,idea怎能还不更新呢~换上了idea2018版本,果然舒服很多,因为本人的jsnode项目都是用coffee写的,但是在跑单元测试的时候遇到了一点问题idea下的mocha单元测试配置方式在这里记录一下首先得要安装号mocha的idea插件打开idea顶部工具栏"RUN""EditConfigurations
Stella981 Stella981
4年前
OpenCV中的destroyallWindows的作用
对OpenCV的destroyallWindows一些认知前言一、先看代码二、网上的资料1.StackOverflow的回答2.官方回答总结前言因为之前在学习OpenCV,当然了网络上有许多的资料,基本上都是在学习前人的造好的轮子。但是我这个人比较喜欢刨根问
Wesley13 Wesley13
4年前
Java PinBall 简单弹球小游戏【4】碰撞检测及边界检测
4.游戏中的碰撞检测(1)弹球游戏中的边界碰撞检测。这个原理大家应该很容易就想到了,用游戏元素的坐标值与整场景的大小来比较就可以判断出元素是否碰到边界了,为了丰富游戏框架,我制作了一个游戏边界碰撞检测器类。大家可以参考类:BorderCrossing,代码我就不贴到这里了。(2)游戏中的元素相互之间的碰撞检测。这里的碰撞包括但
Wesley13 Wesley13
4年前
35岁是技术人的天花板吗?
35岁是技术人的天花板吗?我非常不认同“35岁现象”,人类没有那么脆弱,人类的智力不会说是35岁之后就停止发展,更不是说35岁之后就没有机会了。马云35岁还在教书,任正非35岁还在工厂上班。为什么技术人员到35岁就应该退役了呢?所以35岁根本就不是一个问题,我今年已经37岁了,我发现我才刚刚找到自己的节奏,刚刚上路。
跨端自渲染绘制的实践与探索
在过去的大半年中,我一直投身于一个跨端自渲染项目的研发工作中,负责其中的渲染模块。现在通过这篇文章,我想记录并分享我们在这个项目中的经验和挑战,希望能为大家日常开发中的涉及到渲染相关的工作带来一些启发和帮助。跨端自渲染的初衷跨端自渲染项目的愿景在于构建一个