首页 > 编程笔记

JS toString()和valueOf()的区别

在 JavaScript 中,由于绝大多数对象的原型链中继承 Object.prototype 原型对象(除非手动改变 prototype),所以它们都包含 Object.prototype 中的属性和方法,而 toString() 和 valueOf() 是比较重要的两个。

toString() 用于在需要字符串的地方,按方法内部的逻辑把对象转换成字符串,而 valueOf() 则用于在需要基本类型的地方,把对象按逻辑转换为基本类型。

toString() 一般需要被覆盖,因为 Object.prototype 中的 toString() 只是单纯地返回 [object Object],没有实际意义,通过覆盖 toString() 方法,在里边返回自定义的字符串,可以让它具有实际意义。

下方示例展示了覆盖 toString() 的方法,代码如下:
const obj={
     a:1,
     b:2,
     toString(){
          return `a=${this.a},b=${this.b}`;
     },
};
obj.toString();  //a=1,b=2
"对象字符串为"+obj;  //对象字符串为a=1,b=2
上述代码中的 obj 在最后隐式地转换成了字符串,并调用了 toString() 方法生成了自定义的字符串。

valueOf() 默认只会返回对象本身,它也需要通过覆盖来返回有意义的值。例如在上例的 obj 中,使用 valueOf() 返回 a+b 的数字基本类型的结果,代码如下:
const obj={
     a:1,
     b:2,
     valueOf(){
          return this.a+this.b;
     },
};
obj.valueOf();//3
+obj;  //3
obj-2;  //1
注意:示例中的+obj同样返回了 valueOf() 的结果,因为一元加可以把非数字类型的值转换为数字类型,而在最后一行obj-2中,减法也需要操作数是数字类型,所以 obj 就调用了 valueOf() 方法隐式地转换成了数字。

推荐阅读