[JS每M日N练] [格物] - 你所不知道的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. 原型链的作用:查找对象的属性或者方法。

参考资料

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜猫逐梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值