Object.prototype.toString.call个人理解

news2024/10/6 18:24:15

文章目录

  • 这段代码的常见用处
    • 参考文献:
  • 拆分理解
    • 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.coloradmin.cn/o/1400382.html

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

相关文章

这可能是最全面的计算机组成原理面试八股文了

第一章 计算机系统概述 “较简单,不做过多赘述,后面会详细学到” 第一节 计算机系统层次结构 1.计算机系统的基本组成:硬件软件 2.计算机硬件的基本组成:运算器存储器控制器输入设备输出设备 3.系统软件和应用软件 系统软件…

.NET国产化改造探索(六)、银河麒麟操作系统中安装多个.NET版本

随着时代的发展以及近年来信创工作和…废话就不多说了,这个系列就是为.NET遇到国产化需求的一个闭坑系列。接下来,看操作。 上一篇文章介绍了如何在银河麒麟操作系统上,使用Nginx.NET程序实现自启动。本文介绍下如何在一个环境中,…

explain工具优化mysql需要达到什么级别?

explain工具优化mysql需要达到什么级别? 一、explain工具是什么?二、explain查询后各字段的含义三、explain查询后type字段有哪些类型?四、type类型需要优化到哪个阶段? 一、explain工具是什么? explain是什么&#x…

macOS 14 Sonoma(苹果电脑系统) pkg完整安装包14.2.1正式版

macOS 14 Sonoma(苹果电脑系统) pkg完整安装包14.2.1正式版 游戏模式 Game mode是macOS Sonoma独有的Mac新游戏功能,在 macOS 14 中启用游戏模式后,Mac 会优先考虑运行游戏的CPU和GPU功能,不仅全面提高了游戏的流畅、稳定的帧率,…

Mybatis原理 - 标签解析

很多开源框架之所以能够流行起来,是因为它们解决了领域内的一些通用问题。但在实际使用这些开源框架的时候,我们都是要解决通用问题中的一个特例问题,所以这时我们就需要使用一种方式来控制开源框架的行为,这就是开源框架提供各种…

Python高级列表操作:性能优化、多线程与数据处理全解析

Python高级列表操作:性能优化、多线程与数据处理全解析 引言Python列表的高级特性列表推导式与生成器表达式列表操作的高级技巧列表与函数式编程列表在数据处理中的应用性能优化与内存管理Python列表与多线程/异步编程结语 引言 在现代软件开发中,选择恰…

【JavaEE Spring】SpringBoot 日志

SpringBoot 日志 1. 日志概述2. 日志使用2.1 打印⽇志2.1.1 在程序中得到⽇志对象2.1.2 使⽤⽇志对象打印⽇志 2.2 ⽇志框架介绍2.2.1 ⻔⾯模式(外观模式)2.2.2 SLF4J 框架介绍 2.3 ⽇志格式的说明2.4 ⽇志级别2.4.1 ⽇志级别的分类2.4.2 ⽇志级别的使⽤ 2.5 ⽇志配置2.5.1 配置…

MySQL---单表查询综合练习

创建emp表 CREATE TABLE emp( empno INT(4) NOT NULL COMMENT 员工编号, ename VARCHAR(10) COMMENT 员工名字, job VARCHAR(10) COMMENT 职位, mgr INT(4) COMMENT 上司, hiredate DATE COMMENT 入职时间, sal INT(7) COMMENT 基本工资, comm INT(7) COMMENT 补贴, deptno INT…

C语言练习day8

变种水仙花 变种水仙花_牛客题霸_牛客网 题目: 思路:我们拿到题目的第一步可以先看一看题目给的例子,1461这个数被从中间拆成了两部分:1和461,14和61,146和1,不知道看到这大家有没有觉得很熟…

前端框架学习 Vue (1) 概念,常用指令

Vue是什么 概念: Vue是一个用于 构建用户界面 的 渐进式 框架 1.构建用户界面:基于数据动态渲染页面 2.渐进式:循序渐进的学习(学一点就能用一点) (1)Vue核心包开发 场景:局部模块改造 (2)Vue核心包&Vue插件 工程化开发 场景:整站开发 3.框架:一套完整的项目…

遇到Access violation at address xxx in module ‘LoadDXF.dll‘.的解决方法

今天在设计PCB的时候,需要导入一个AutoCAD生成的DWG文件,结果导入出错,之前从来没有遇到过。也不清楚原因。错误的内容,如标题所示:Access violation at address xxx in module LoadDXF.dll. 对于我们既搞编程又设计…

PaddleDetection学习1——使用Paddle-Lite在 Android 上实现实时的目标检测功能

在 Android 上使用Paddle-Lite实现实时的目标检测功能 1 环境准备1.1 安装Android Studio1.1.1 安装JAVA JDK1.1.2 Android Studio 安装步骤1.1.3 Android Studio 配置NDK 1.2 Android 手机 2 部署步骤2.1 下载Paddle-Lite-Demo2.2 打开 yolo_detection_demo项目2.2.1 修改buil…

【Spring 篇】MyBatis中的CRUD魔法:数据之美的四重奏

MyBatis,这个数据持久化的魔法师,以其优雅的SQL映射和简洁的配置文件,为我们呈现出一场CRUD(Create, Read, Update, Delete)的奇妙之旅。在这篇博客中,我们将深入探讨MyBatis中的增、删、改、查操作&#x…

一键搭建你的知识库

效果 说明 由于安装包安装需要glibc>2.7 我就不尝试了 因为glib升级是一个繁琐的过程 没有升级的意义 只是为了体验知识库 没必要浪费时间 1.1docker compose部署trilium 1.1.创建目录 mkdir -p /opt/triliumcd /opt/trilium 1.2.编写docker-comppose.yml文件 vim dock…

非线性失真放大电路设计

文章目录 一、设置要求二、系统组成三、仿真设计3.1 放大电路总体设计3.2 仿真结果3.2.1 正常波形3.2.2 双向失真3.2.3 顶部失真(截至失真)3.2.4 底部失真(饱和失真)3.2.5 交越失真3.2.6 50Khz\2mv放大 四、原理图与PCB设计4.1 放大电路部分原理图4.2 控制电路部分4.3 PCB设计 …

EasyRecovery2024专业免费的数据恢复软件,支持从硬盘、光盘、U盘、移动硬盘、等所有类型的介质上恢复数据。

Ontrack EasyRecovery Home是一款企业级的数据恢复软件,支持从硬盘、光盘、U盘、移动硬盘、硬件RAID及软件RAID等所有类型的介质上恢复数据。支持恢复误删除、磁盘格式化、磁盘重新分区、磁盘逻辑坏道等原因而丢失的数据。支持RAID重建!Ontrack EasyReco…

如何正确地为Python项目安装依赖

a、创建Python项目,其结构如下: b、激活虚拟环境 启动DOS窗口—>进入“Scripts”目录,这里为D:\workspace\prj_python_1\venv\Scripts—>执行activate激活虚拟环境,如下所示: Microsoft Windows [版本 10.0.18…

李宏毅 Generative Adversarial Network(GAN)生成对抗网络

(延申)GAN Lecture 1 (2018)- Introduction_哔哩哔哩_bilibili Basic Idea of GAN 附课程提到的各式各样的GAN:https://github.com/hindupuravinash/the-gan-zoo 想要让机器做到的是生成东西。->训练出来一个generator。 假设要做图像生成,要做的是…

【RT-DETR有效改进】华为 | Ghostnetv1一种专为移动端设计的特征提取网络

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

Day33 122买卖股票最佳时机 55跳跃游戏 45跳跃游戏II

122 买卖股票最佳时机 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。 注意:你不能同时参与多笔交易(你…