理解JavaScript中的toString方法

2,791 阅读2分钟

先看例子:

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的方法。

有些东西看似简单,其实含有一些很有价值的知识和理论,甚至是一些超过编程以外的收获,而这些往往是在一些很特别的经历过后才会感受到。这也是为什么每个年龄看同一本书看到的东西不同,收获也不同。所以不管多么简单,隔一段时间看看,会学到很多。反正记住,这个世界没有白辛苦,只要我们保持总结的习惯,让每一份经历都变成进步的阶梯。