Object.prototype.toString.call个人理解

文章目录

  • 这段代码的常见用处
    • 参考文献:
  • 拆分理解
    • 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都重写过了。

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

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,
简单示例代码:

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函数呢?

首先是,打入下列代码

let str="string"

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

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


至此,结束。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/637744.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MVC的设计理念

MVC的设计理念 MVC 是一种使用 MVC(Model View Controller 模型-视图-控制器)设计创建 Web 应用程序的模式; Model(数据模型)表示应用程序核心, 处理应用程序数据。 View(视图)显示…

(007)Gradle 打包时拷贝依赖包到 lib

文章目录 引资附录 引资 1.示例代码: /** This file was generated by the Gradle init task.** This project uses Incubating APIs which are subject to change.*/plugins {id javaid maven-publish // id "io.freefair.lombok" version "8.…

easy Exsel导出

目录 一、首先引入依赖 二、然后封装一个VO 三、Controller层 四、Service实现类 引用样式 自适应列宽 自适应行高 五、测试 postman ​编辑 浏览器 异常 分配到这个任务了,写个小demo记录下,具体可参考EasyExcel官方文档 我用的是web上传…

CCC数字钥匙设计【NFC基础】--LPCD相关介绍

关于NFC卡检测,主要可以分成两个步骤: 1、LPCD低功耗检测,唤醒NFC读卡器。 2、唤醒后,NFC读卡器或MCU控制器轮询Type A、Type B、Type F、Type V(ISO15693)等卡类型。 本文主要介绍LPCD相关功能&#xff…

设备管理——WinCC 给你神助功

要实现“设备高效”,就必须“管之有道”,来自设备层的数据支撑将是必不可少的,提高设备效能的2个关键在于降低平时停机时间 (MDT) 和提高平均无故障时间 (MTBF)。通常来说,设备维护可大致可分为三个层次:纠正性维护&am…

c++ mysql数据库编程(linux系统)

ubuntu下mysql数据库的安装 ubuntu安装mysql(图文详解)-CSDN博客https://blog.csdn.net/qq_58158950/article/details/135667062?spm1001.2014.3001.5501 项目目录结构 数据库及表结构 public.h //打印错误信息 #ifndef PUBLIC_h #define PUBLIC_H…

【详解】通讯录项目

目录 通讯录项目要求: 引言: 步骤如下: 用户的数据类型: 初始化循序表: 菜单: 添加联系人: 删除联系人: 修改联系人: 查找联系人: 查看通讯录&…

《WebKit 技术内幕》之七(1): 渲染基础

《WebKit 技术内幕》之七(1): 渲染基础 WebKit的布局计算使用 RenderObject 树并保存计算结果到 RenderObject 树。 RenderObject 树同其他树(如 RenderLayer 树等),构成了 WebKit 渲染的为要基础设施。 1…

【RT-DETR有效改进】Google | EfficientNetV1一种超轻量又高效的网络 (附代码 + 添加教程)

前言 大家好,我是Snu77,这里是RT-DETR有效涨点专栏。 本专栏的内容为根据ultralytics版本的RT-DETR进行改进,内容持续更新,每周更新文章数量3-10篇。 专栏以ResNet18、ResNet50为基础修改版本,同时修改内容也支持Re…

python算法与数据结构---排序和归并排序

学习目标 掌握归并排序的基本原理使用python语言解答归并排序题目 归并排序 原理及过程 将两个有序的数组合并成一个有序数组称为从上往下分解:把当前区间一分为二,直至分解为若干个长度为1的子数组从上往下的合并:两个有序的子区域两两向…

Pytest 测试框架与Allure 测试报告——Allure2测试报告-L1

目录: allure2安装 Allure2介绍Allure2报告展示Allure2报告展示-首页概览Allure2报告展示-用例详情页Allure2安装Allure2下载与安装Allure环境验证插件安装-Python插件安装-Java验证插件安装-Javaallure2运行方式 生成测试报告流程使用Allure2运行方式-Python使用A…

FaFu--练习复盘--3

4、指针的应用 4.1、三角形周长和面积计算程序 描述 已知三角形的三条边的长度,求该三角形的周长和面积,如果三个边不能构成三角形,则三角形的周长和面积都为0。完成程序的编写。 输入 输入1行,包含3个实数,各实数之…

大模型关键技术:上下文学习、思维链、RLHF、参数微调、并行训练、旋转位置编码、模型加速、大模型注意力机制优化、永久记忆、LangChain、知识图谱、多模态

大模型关键技术 大模型综述上下文学习思维链 CoT奖励建模参数微调并行训练模型加速永久记忆:大模型遗忘LangChain知识图谱多模态大模型系统优化AI 绘图幻觉问题从 GPT1 - GPT4 拆解GPTs 对比主流大模型技术点旋转位置编码层归一化激活函数注意力机制优化 大模型综述…

四种方法将 Docker Registry 迁移至 Harbor

Registry Docker Distribution Docker Distribution 是第一个是实现了打包、发布、存储和镜像分发的工具,起到 docker registry 的作用。(目前 Distribution 已经捐赠给了 CNCF)。其中 Docker Distribution 中的 spec 规范后来也就成为了 O…

在线WebOffce在HTML/VUE/Electron纯前端网页编辑Office之打开Word后自动处于修订模式

在线办公协同办公过程中,对于老板给出的文档修改,如果在错别字方面都要自己一个个字去看的话也太浪费时间了,其实word上就有一个修订模式,可以帮助大家高效完成文档的修改,在线WebOffce在HTML/VUE/Electron纯前端网页编…

Semaphone应用源码分析

Semaphone应用&源码分析 3.1 Semaphore介绍 sync,ReentrantLock是互斥锁,保证一个资源同一时间只允许被一个线程访问 Semaphore(信号量)保证1个或多个资源可以被指定数量的线程同时访问 底层实现是基于AQS去做的。 Semap…

pinia 的使用方法

使用方式(选项式) 1、在 mian.js 导入 pinia 里的 createPinia 函数。 2、app.use 这个 createPinia 函数的返回值。 // main.jsimport { createPinia } from pinia;app.use(createPinia()); 3、创建一个 js 文件(该文件保存着共享的数据&…

Git和SVN

1、Git Git是一个分布式版本控制系统,由Linus Torvalds创建,用于有效、高速地处理从小到大的项目版本管理。Git是开源的,采取了分布式的版本库的方式,不需要服务器端软件就可以运行。 Git的核心概念 以下是Git中的一些核心概念…

《Python数据分析技术栈》第03章 02 数据结构(Structure of data)

02 数据结构(Structure of data) 《Python数据分析技术栈》第03章 02 数据结构(Structure of data) The data that we need to analyze could have any of the following structures, 我们需要分析的数据可能具有以下任何一种结…

RabbitMQ-数据持久化

一、持久化类型 1、交换机持久化(SpringAMQP默认) 2、队列持久化(SpringAMQP默认) 3、消息持久化 二、消息持久化 1、纯内存操作 如果采用纯内存操作,那么消息存储达到队列的上限之后,会有一个page ou…