首页 > 编程笔记
JS toString()和valueOf()的区别
在 JavaScript 中,由于绝大多数对象的原型链中继承 Object.prototype 原型对象(除非手动改变 prototype),所以它们都包含 Object.prototype 中的属性和方法,而 toString() 和 valueOf() 是比较重要的两个。
toString() 用于在需要字符串的地方,按方法内部的逻辑把对象转换成字符串,而 valueOf() 则用于在需要基本类型的地方,把对象按逻辑转换为基本类型。
toString() 一般需要被覆盖,因为 Object.prototype 中的 toString() 只是单纯地返回 [object Object],没有实际意义,通过覆盖 toString() 方法,在里边返回自定义的字符串,可以让它具有实际意义。
下方示例展示了覆盖 toString() 的方法,代码如下:
valueOf() 默认只会返回对象本身,它也需要通过覆盖来返回有意义的值。例如在上例的 obj 中,使用 valueOf() 返回 a+b 的数字基本类型的结果,代码如下:
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() 方法隐式地转换成了数字。