JavaScript中的对象到字符串转换

时间:2013-02-23 09:09:57

标签: javascript

我在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

感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

{p}在console.log("hello " + obj);中,执行obj类型转换的运算符为+,称为adition运算符。

在加法运算符中

,而不是强制转换为字符串,每个参数都转换为原始值而没有类型提示。将对象强制转换为没有类型提示的基元时,如果可用,则使用方法valueOf。仅当valueOf不可调用或返回非原始值时,才使用toString。如果valueOftoString都返回非原始值,则会抛出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的调用中未提供任何提示。

http://es5.github.com/#x9.1

  

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