文章目录
导读
开发过程中经常遇到使用
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)的理解
- Object也是个函数,而任何函数都是Function的实例对象。
- Function可以看作Function自身的实例,所以它的显示原型和隐式原型都指向Function.prototype。
- 任何对象都是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
原型链
相关知识。下面是对其简单的总结:
- 访问一个对象的属性/方法时:
· 先在自身属性/方法中查找,找到则返回。
· 如果没有找到,就会沿着__proto__这条链去查找,找到也会返回。
· 如果查到了原型链的尽头还是没有查找到,则返回undefined。- 因为在实例化对象查找属性或者方法时总是沿着__proto__隐式原型链查找,所以原型链又称作隐式原型链。
- 原型链的作用:查找对象的属性或者方法。
参考资料
- 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