我在JavaScript中使用对象进行字符串转换。所有对象都继承了两个转换函数 - toString()
和valueOf()
。当JavaScript尝试将对象转换为字符串时,它会搜索toString()
实现,然后搜索valueOf()
实现。所以我以这种方式覆盖了toString()
和valueOf()
:
var obj = {
x: 10,
y: 20,
toString: function() {
return "x = " + this.x + ", y = " + this.y;
},
valueOf: function() {
return this.x + ", " + this.y;
}};
将对象文字与字符串连接:
console.log("hello " + obj);
输出:hello 10, 20
输出不应该是:hello x = 10, y = 20
?
感谢任何帮助。
答案 0 :(得分:2)
console.log("hello " + obj);
中,执行obj
类型转换的运算符为+
,称为adition运算符。
在加法运算符中,而不是强制转换为字符串,每个参数都转换为原始值而没有类型提示。将对象强制转换为没有类型提示的基元时,如果可用,则使用方法valueOf
。仅当valueOf
不可调用或返回非原始值时,才使用toString
。如果valueOf
和toString
都返回非原始值,则会抛出TypeError
。
引用规范:
http://es5.github.com/#x11.6.1
11.6.1加法运算符(+)
1)让lref成为评估AdditiveExpression的结果 2)让lval为GetValue(lref) 3)让rref成为评估MultiplicativeExpression的结果。 4)让rval为GetValue(rref)。 5)让lprim为ToPrimitive(lval)。
6)让rprim为ToPrimitive(rval)。
7)如果Type(lprim)是String或Type(rprim)是String,那么
......注意1 在步骤5和6中对ToPrimitive的调用中未提供任何提示。
9.1 ToPrimitive
...
对象 - 返回Object的默认值。通过调用对象的[[DefaultValue]]内部方法,传递可选提示PreferredType来检索对象的默认值。 [[DefaultValue]]内部方法的行为由本规范为8.12.8中的所有本机ECMAScript对象定义。
http://es5.github.com/#x8.12.8
8.12.8 [[DefaultValue]](提示)
当没有提示调用O的[[DefaultValue]]内部方法时,它的行为就好像提示是Number,除非O是Date对象(见15.9.6),在这种情况下它的行为就好像提示是String。
...
当使用提示号调用O的[[DefaultValue]]内部方法时,将执行以下步骤:
1)设valueOf是使用参数“valueOf”调用对象O的[[Get]]内部方法的结果。
2)如果IsCallable(valueOf)为真,则
- 设val是调用valueOf的[[Call]]内部方法的结果,其中O为此值和空参数列表。
- 如果val是原始值,则返回val ...
答案 1 :(得分:0)
如果要在对象中添加String,它会尝试转换原始值,这是调用valueOf的原因而不是toString
https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/valueOf