Object.prototype.toString.call个人理解

news/2024/7/19 15:10:10 标签: 原型, 原型链, js, 原型对象

文章目录

  • 这段代码的常见用处
    • 参考文献:
  • 拆分理解
    • 1、Object.prototype.toString
      • 小问题
      • 参考文献:
    • 2、call函数的作用
      • 参考文献
    • 3、继续深入一些(这部分内容是个人理解,没有明确文献支撑)


这段代码的常见用处

Object.prototype.toString.call()最经常用来判断js中某变量的类型。

有人说,typeof不行吗,的确,typeod可以用来判断部分的变量的类型,但是仅仅是部分罢了。
typeof 无法区别null{“num”:1}这两个变量值的类型,正确的类型应该是Null和Object,但是typeof对于它们的输出却都是:

在这里插入图片描述

因此,需要一个合适的工具来识别各类变量的变量类型,Object.prototype.toString.call()就是这样的一种工具。
用法:Object.prototype.toString.call(变量);

实例:
在这里插入图片描述

参考文献:

为什么Object.prototype.toString.call()可以如此准确的判断对象类型? - 掘金 (juejin.cn)

关于如何js中如何判断一个变量所属类型的方法感兴趣的可以看下面的这两种方法:

JavaScript 如何判断变量(数据)类型_用来判断某个数据或变量-CSDN博客
如何判断JS中一个变量是 string 类型 - 掘金 (juejin.cn)


拆分理解

1、Object.prototype.toString

Object是函数,函数具备着prototype(原型),通过这个Object.prototype可以获取Object函数对应的原型对象原型对象具备的toString()正好可以通过this指向当前这个对象,继而显示这个对象的类型

总所周知,所有的对象都是最初的原型都是Object的原型对象的,它们继承了来自Object的属性,自然也继承了toString这个方法。(这种继承和别的继承,有着一定的区别,这和js原型链有关系。)

既然如此,那为什么不直接使用每个对象各自的toString呢?那是因为,这些对象的toString都重写过了。

如果使用字面量创建对象,例如:

js">let c={"num":1}

这种对象的toString自然没有重写,当然它也没有直接拥有来自Object的toString函数,需要我们通过原型链寻找

在这里插入图片描述

小问题

这里面倒是还有个小问题,我没弄懂。

函数是一种特殊的对象,Object.prototype的toString函数继承自Object,在我现有的知识看来Object.prototype.toString()和Object.toString()应该是同一函数,但是不知道是否在创建Object.prototype的过程中有无重写函数。
但是可以知道的是,Object.toString.call()是无法使用的。

参考文献:

彻底理解JavaScript原型链(一)—__proto__的默认指向 - 简书 (jianshu.com)
JavaScript中,对象是函数吗? - 知乎 (zhihu.com)
https://www.jianshu.com/p/686b61c4a43d


2、call函数的作用

通过对象调用的call能够改变这个对象中的this,
简单示例代码:

js">function sayHello() {
  console.log("Hello, " + this.name);
}

const person = {
  name: "John"
};

sayHello.call(person); // 输出: Hello, John

通过这部分的参考文献可以知道,apply函数也可以起到改变this的值,所以Object.prototype.toString.apply()也是可以的。

参考文献

call()与apply()的作用与区别


3、继续深入一些(这部分内容是个人理解,没有明确文献支撑)

Object.prototype.toString()会返回对应的字符串,那么为什么这个字符串具有call函数呢?

首先是,打入下列代码

js">let str="string"

这种字符串是基本类型String的字符串,原型是String构造函数对应的原型对象。

由于这种字符串本身不具备call函数的时候(就像前文的let c={“num”:1}一样),会通过原型链先找到String.prototype(String这个函数对应的原型对象),发现它仍然没有call函数的时候,会继续通过原型链找到Object.prototype,找到call函数。
在这里插入图片描述


至此,结束。

如果你觉得这篇文章写的不错,多多点赞~收藏吧!


http://www.niftyadmin.cn/n/5336928.html

相关文章

深入数仓离线数据同步:问题分析与优化措施

一、前言 在数据仓库领域,离线数仓和实时数仓是常见的两种架构类型。离线数仓一般通过定时任务在特定时间点(通常是凌晨)将业务数据同步到数据仓库中。这种方式适用于对数据实时性要求不高,更侧重于历史数据分析和报告生成的场景…

vue-项目打包、配置路由懒加载

1. 简介 在现代前端开发中,Vue.js因其简洁、灵活和高效的特点,已经成为许多开发者的首选框架。 在Vue项目中,打包部署和路由懒加载是两个非常重要的环节。 打包Vue项目是为了将源代码转换为浏览器可以解析的JavaScript文件,以便…

4个值得使用的免费爬虫工具

在信息时代,数据的获取对于各行业都至关重要。而在数据采集的众多工具中,免费的爬虫软件成为许多用户的首选。本文将专心分享四款免费爬虫工具,突出介绍其中之一——147采集软件,为您揭示这些工具的优势和应用,助您在数…

好用的流程图工具

分享工作中常用的装逼工具 目前市面上的流程图或者思维导图工具挺多的,但是有的会限制使用数量或者收费,典型的有processon、Xmind,推荐今天Mermaid(官网)。 快速上手 中文教程:Mermaid 初学者用户指南 | Mermaid 中文网。我们选择…

【成本价特惠】招募证书代理:工信部、PMP、阿里云、华为等认证,机会难得!

扫码和我联系 亲爱的读者朋友们, 今天,我想和大家分享一个难得的机会。我们目前正在积极招募各类证书的代理,包括工信部的证书、PMP(项目管理专业人士)证书、阿里云证书、华为证书、OCP 证书、CFA 证书等。这些证书在…

C# 字符串(String)

文章目录 前言一、C#字符串(String)二、String 类的属性/方法总结 前言 C#基础学习入门系列- C# 字符串(String) 一、C#字符串(String) C#字符串(String)是一种不可变的序列字符。…

【Linux】第三十一站:管道的一些应用

文章目录 一、我们之前的|(竖划线)管道二、自定义shell三、使用管道实现一个简易的进程池1.详解2.代码3.一个小bug4.最终代码 一、我们之前的|(竖划线)管道 cat test.txt | head -10 | tail -5如上代码所示,是我们之前所用的管道 我们拿下面这个举个例子 当我们用…

HBase shell 常用命令总结

HBase shell 常用命令总结 1. status hbase> status #集群状态 hbase> status simple #集群各节点状态信息 hbase> status detailed #各表region状态信息2. whoami hbase> whoami #查询当前hbase用户3. version hbase> version #查询hbase版本4. alter hba…