[JS每M日N练] [格物] - 你所不知道的toString

news2024/9/28 19:24:53

文章目录

    • 导读
    • Object.prototype.toString
      • 常见类型转换结果
      • Object.toString !== Object.prototype.toString
      • 对Object.prototype.toString.call(obj)的理解
    • .toString
      • .toString TypeError误区
      • tostring被改写了定义在原型链的什么位置上
      • 方法重写
    • 文章小结
    • 参考资料

导读

开发过程中经常遇到使用toSting的情况,该函数作用是将某对象转换为字符串
然而就是这么个小小的函数,一不小心就写错了,今天小结一下该函数用法。

在这里插入图片描述

Object.prototype.toString

在Object.prototype上有一个toString方法,返回的是值类型。也就是说它可以精准地判断输入值的数据类型

常见类型转换结果

下图展示了常见类型的转换结果:
在这里插入图片描述
其中{}.toString就是Object.prototype.toString,有图为证:
在这里插入图片描述

ps:注意下面四个语句的结果,使用时,{}.最好替换为({}).
在这里插入图片描述

Object.toString !== Object.prototype.toString

在这里插入图片描述

  • Object.toString :Object函数对象的toString方法
  • Object.prototype.toString :Object原型对象的toString方法

某大佬的图介绍了原型链中示例对象、原型对象、函数对象中的关系:
在这里插入图片描述

对Object.prototype.toString.call(obj)的理解

  1. Object也是个函数,而任何函数都是Function的实例对象。
  2. Function可以看作Function自身的实例,所以它的显示原型和隐式原型都指向Function.prototype。
  3. 任何对象都是Object的instance,因为原型链的顶端都指向Object.prototype。

实际上,所有的类在继承Object的时候,改写了toString()方法
而只有Object原型上的方法是可以输出数据类型的。因此我们想判断数据类型时,也只能使用原始方法。继而有了此方法:Object.prototype.toString.call(obj)。

.toString

字面量及函数对象的.toString执行结果:
在这里插入图片描述

.toString TypeError误区

上图中,有三个TypeError报错,我们以1.toString()讲解下该报错。

其实上面的报错只是语法上的问题,js引擎无法解释1.后面的内容,1是Number类型,1.引擎认为后面应该跟数字,所以报了错误:
在这里插入图片描述

其实Number.toString是正确的,代码写作(1).toString()就可以了,写作1.0.toString()也可以!!!

总之,不是数字(或者说整数)没有toString方法,只是引擎从语法解析上,将1.先做为浮点数处理了,要求后面必须是数字!!!

tostring被改写了定义在原型链的什么位置上

通过下面的方式,判断一个对象是否重写了toString。

  var arr=[1,2,3]
  console.log(Array.prototype.hasOwnProperty('toString'))  //true
  console.log(Array.hasOwnProperty('toString'))  //false
  console.log(arr.hasOwnProperty('toString'))    //false

方法重写

在 JavaScript 中,toString() 方法是 Object.prototype 上的一个方法,用于将对象转换为字符串。如果我们想要重写 toString() 方法,可以在对象的原型链上定义一个新的 toString() 方法。

例如,我们可以创建一个名为 Person 的构造函数,并在其原型上定义一个 toString() 方法,以返回该对象的姓名和年龄:

function Person(name, age) {
  this.name = name;
  this.age = age;
}

Person.prototype.toString = function() {
  return this.name + " is " + this.age + " years old.";
};

var person = new Person("John", 30);
console.log(person.toString()); // "John is 30 years old."

文章小结

如果想对toString有更深入的理解,需要充分了解js原型链相关知识。下面是对其简单的总结:

  1. 访问一个对象的属性/方法时:
    · 先在自身属性/方法中查找,找到则返回。
    · 如果没有找到,就会沿着__proto__这条链去查找,找到也会返回。
    · 如果查到了原型链的尽头还是没有查找到,则返回undefined。
  2. 因为在实例化对象查找属性或者方法时总是沿着__proto__隐式原型链查找,所以原型链又称作隐式原型链。
  3. 原型链的作用:查找对象的属性或者方法。

参考资料

  • MDN的toString解释:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/toString
  • 对Object.prototype.toString.call(obj)的理解 https://blog.csdn.net/weixin_42349568/article/details/109006143
  • 为什么用{}.toString.call(obj)来判断数据类型 https://blog.csdn.net/e87e09e11/article/details/69389882
  • 一文读懂原型链 prototype和__proto__详解 https://blog.csdn.net/weixin_44384728/article/details/125951909

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

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

相关文章

同时使用注解和 xml 的方式引用 dubbo 服务产生的异常问题排查实战

文章目录 一、现象二、问题排查三、结论四、解决方案 一、现象 使用 nacos 作注册中心的线上 dubbo 消费端应用每隔 1 分钟就会抛出以下异常(为使描述简单化,文章中使用本地 demo 来复现),该异常表示无法连接到 172.17.0.1:20881…

JavaWeb( 二 ) URL

1.4.URL统一资源定位符 URL代表Uniform Resource Locator 统一资源定位符,也叫 URL地址 。是用于标识和定位Web上资源的地址,通常用于在Web浏览器中访问网站和文件。 URL由若干部分组成,scheme:// host : port / path 例如: htt…

Contest3111 - 计科2101~2104算法设计与分析上机作业07

问题 A: 有重复元素的排列问题 题目描述 设R{ r 1 , r 2 , …, r n }是要进行排列的n个元素。其中元素r 1 , r 2 , …, r n 可能相同。试设计一个算法, 列出R的所有不同排列。给定n 以及待排列的n 个元素。计算出这n 个元素的所有不同排列。 输入 第1 行是元素个…

android四大组件之一-Activity实现原理分析

前言: 这篇文章是我花费时间最久的一篇文章,整整的两个月。整个流程繁琐是一个方面的原因,另外一个原因是我想尽可能的把整个流程的逻辑尽可能详细的一一描述出来,以及结合到我们项目中遇到的一些问题来进行解释,毕竟…

【五一创作】VS+Qt主界面内嵌自定义控件的四种方法以及不同自定义控件数据交互

前言 在Qt界面开发过程中,一个主界面或者主窗口看成是各个控件排列组合后的集合,对于一些项目而言,有些常用的控件可以封装成自己想要的控件样式并且复用,比如说,log显示控件,图像/视频显示控件等&#xf…

【ros2】ros melodic迁移到ros2 dashing过程中碰到的问题及解决方法

序言 总结踩坑经历,以利他人 1. error: forming pointer to reference type … & 报错原因: ros2回调函数的参数不能是引用形式 &,需要去除& 解决方法: 如果是指针引用,直接去除引用 void Callback(con…

【Java开发】Spring Cloud 11:Gateway 配置 ssl 证书(https、http、域名访问)

最近研究给微服务项目配置 ssl 证书,如此才可以对接微信小程序(需要使用 https 请求)。传统单体项目来说,首先往项目中添加证书文件,然后在配置文件中配置 ssl 证书路径、密码等相关信息;那么微服务这么多项…

机器学习强基计划8-5:图解局部线性嵌入LLE算法(附Python实现)

目录 0 写在前面1 流形学习2 局部线性嵌入算法2.1 什么是局部线性嵌入?2.2 算法原理推导 3 Python实现3.1 算法流程3.2 核心代码3.3 可视化 0 写在前面 机器学习强基计划聚焦深度和广度,加深对机器学习模型的理解与应用。“深”在详细推导算法模型背后的…

基于学生成绩管理系统(附源代码及数据库)

基于Ecplise,jsp的学生成绩管理系统 目录 登录页面 系统主页 管理员账号管理 学生查询 课程管理 成绩管理 后台数据库 源代码下载(含数据库) 毕设项目专栏 分为以下四大板块: 系统用户管理: 包含管理员账号管理&#…

【一起撸个DL框架】5 实现:自适应线性单元

CSDN个人主页:清风莫追欢迎关注本专栏:《一起撸个DL框架》GitHub获取源码:https://github.com/flying-forever/OurDL 文章目录 5 实现:自适应线性单元🍇1 简介2 损失函数2.1 梯度下降法2.2 补充 3 整理项目结构4 损失函…

第二十七章 Unity碰撞体Collision(下)

本章节我们继续研究碰撞体,并且探索一下碰撞体与刚体之间的联系。我们回到之前的工程,然后给我们的紫色球体Sphere1也添加一个刚体组件。如下所示 此时,两个球体都具备了碰撞体和刚体组件。接下来,我们Play运行查看效果 我们发现&…

第二十六章 Unity碰撞体Collision(上)

在游戏世界中,游戏物体之间的交互都是通过“碰撞接触”来进行交互的。例如,攻击怪物则是主角与怪物的碰撞,触发机关则是主角与机关的碰撞。在DirectX课程中,我们也大致介绍过有关碰撞检测的内容。游戏世界中的3D模型的形状是非常复…

浅谈区块链1.0-比特币

1. 比特币解决的问题 高度自治:国际经济危机无国界贸易:不同国家进行的贸易或者不同平台进行贸易 不可窜改:例如银行交易可能会被窜改数据 隐私安全:传统汇款方式会暴露你的个人信息,一旦数据库被别人入侵&#xff0c…

android基础知识复习

架构: 应用框架层(Java API Framework)所提供的主要组件: 名称功能描述Activity Manager(活动管理器)管理各个应用程序生命周期,以及常用的导航回退功能Location Manager(位置管理器…

SpringBoot整合Mybatis-plus实现多级评论

在本文中,我们将介绍如何使用SpringBoot整合Mybatis-plus实现多级评论功能。同时,本文还将提供数据库的设计和详细的后端代码,前端界面使用Vue2。 数据库设计 本文的多级评论功能将采用MySQL数据库实现,下面是数据库的设计&…

Boonz-KeygenMe#1(★★★)

运行程序 错误: 查壳 没有壳,是汇编写的程序 载入OD 前面是在读取输入内容,到这里开始做计算了 分析 首先遍历了用户名,计算结果保存在EBX,在存放到 0x40E0F8 对EBX中的值再次计算,最后结果保存到 …

JavaFX: Java音乐播放读取歌词

JavaFX: Java音乐播放读取歌词 1、lrc歌词文件2、解析lrc歌词2.1 读取每行歌词2.2 解析歌词时间标签Time-tag2.3 解析歌词标识标签ID-tags2.4 创建对象包含歌词相关信息 3、播放显示歌词** 相关文献 JavaFX: Java音乐播放 1、lrc歌词文件 lrc歌词文件的扩展名 1、标准格式&a…

图像处理:Retinex算法

目录 前言 概念介绍 Retinex算法理论 单尺度Retinex(SSR) 多尺度Retinex(MSR) 多尺度自适应增益Retinex(MSRCR) Opencv实现Retinex算法 SSR算法 MCR算法 MSRCR算法 效果展示 总结 参考文章 前…

基频建模方法总结

基频F0建模方法 语音合成领域需要对基频进行建模,具体到文语转换TTS、语音转换VC、情感语音转换EVC领域等。 语音合成F0 包括文语转换,情感语音转换 TTEF:text-to-emotional-features synthesis EVC:emotional voice conversio…

这些你熟知的 app 和服务,都用上了人工智能

从微软在 Microsoft 365 服务中全面整合 GPT-4 能力 ,让 PPT、Word 文档、Excel 表格的制作变成了「一句话的事」,到 Adobe 刚刚发布 Adobe Firefly模型集合,让图形设计、字体风格、视频渲染乃至 3D 建模的门槛显著降低——你我熟知的那些工…