先看例子:
let a = 10;
console.log(a.toString()) // "10"
如果一个变量是数字类型,那么带有的toString就可以将其转换成字符串,我们经常使用,同时也觉得这样也很合理。
console.log(Number.toString())
/*
"function Number() { [native code] }"
*/
我们知道数字有一个构造方法,可以通过这个构造方法实例化一个数字对象。根据打印的结果我们知道,Number其实就是一个方法。其实通过两种方式得到的并不完全相同。
function test() {
let a = "test";
console.log(a);
}
console.log(test.toString())
/*
"function test() {
let a = "test";
console.log(a);
}"
*/
我们再看看其他类型:
let b = true;
console.log(b.toString()); // "true"
let c = "wujingyue";
console.log(c.toString()); // "wujingyue"
let d = [1, 2, 3, 4];
console.log(d.toString()); // "1,2,3,4"
let e = Symbol();
console.log(e.toString()); // "Symbol()"
let f = undefined;
console.log(f.toString()); // 报错 “Cannot read property 'toString' of undefined”
let g = null;
console.log(g.toString()); // 报错 “Cannot read property 'toString' of null”
从以上的表现来看,对于每一种类型都有自己的toString方法,其中undefined和null这两种类型没有对应的方法,同时这也是程序经常报错的地方。根据有toString方法的类型来看,我们发现这个方法就是将输入的类型转换成字符串的形式进行输出,对于每一种类型的字符串形式官方有规定,比如数组则是里面的元素按逗号的方式进行连接。 接下来我们来看引用类型object的toString方法,看看打印出来的结果是什么。
let a = {};
console.log(a.toString()); // "[object Object]"
对于对象来说,官方的定义则是上面的样子,并不能看到对象里面的属性。如果你使用js多的话,你肯定看到过这样的输出。之所以会打印这样的结果,就是你调用的方法输出了对象的toString方法。
现在我们可以得出一个结论,每一种类型的toString各有不同,并不是所有的都是使用原型链顶端的toString,也就是Object的toString,我们在编写类的时候,通常也会根据需求重写toString的方法。
有些东西看似简单,其实含有一些很有价值的知识和理论,甚至是一些超过编程以外的收获,而这些往往是在一些很特别的经历过后才会感受到。这也是为什么每个年龄看同一本书看到的东西不同,收获也不同。所以不管多么简单,隔一段时间看看,会学到很多。反正记住,这个世界没有白辛苦,只要我们保持总结的习惯,让每一份经历都变成进步的阶梯。