JavaScript中的对象到字符串转换

JavaScript中的对象到字符串转换,javascript,Javascript,我在玩JavaScript中的对象到字符串转换。所有对象都继承两个转换函数-toString()和valueOf()。当JavaScript试图将对象转换为字符串时,它会搜索toString()实现,然后搜索valueOf()实现。因此,我以这种方式重写了toString()和valueOf(): var obj = { x: 10, y: 20, toString: function() { return "x = " + this.x + ", y = " + this.y;

我在玩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);
输出
你好10,20

输出不应该是:
hello x=10,y=20


谢谢你的帮助

如果要添加带有对象的字符串,它会尝试在原语值中转换,而原语值正是调用valueOf的原因,而不是toString

console.log中的(“hello”+obj)
,执行
obj
类型转换的运算符是
+
,称为adition运算符

在加法运算符中,不是将每个参数转换为字符串,而是将每个参数转换为基本值,而无需类型提示。当对象在没有类型提示的情况下强制转换为基元时,如果可用,将使用方法
valueOf
。只有当
valueOf
不可调用或返回非原语值时,才会使用
toString
。如果
valueOf
toString
都返回非原语值,则抛出
TypeError


引用规范:

11.6.1加法运算符(+) 1) 让lref是计算AdditiveExpression的结果。
2) 设lval为GetValue(lref)。
3) 让rref是计算乘法表达式的结果。 4) 设rval为GetValue(rref)。 5) 让lprim为上主元(lval)。
6) 让rprim为ToPrimitive(rval)。
7) 如果类型(lprim)为字符串或类型(rprim)为字符串,则
...

注意1在步骤5和6中对ToPrimitive的调用中未提供任何提示

9.1主元

对象-返回对象的默认值。通过调用对象的[[DefaultValue]]内部方法并传递可选提示PreferredType,可以检索对象的默认值。[[DefaultValue]]内部方法的行为由本规范为8.12.8中的所有本机ECMAScript对象定义

8.12.8[[DefaultValue]](提示) 当在没有提示的情况下调用O的[[DefaultValue]]内部方法时,它的行为就像提示是数字一样,除非O是日期对象(参见15.9.6),在这种情况下,它的行为就像提示是字符串一样

使用提示号调用O的[[DefaultValue]]内部方法时,将执行以下步骤:

1) 让valueOf作为调用对象O的[[Get]]内部方法(参数为“valueOf”)的结果。
2) 如果IsCallable(valueOf)为真

  • 让val作为调用valueOf的[[Call]]内部方法的结果,其中O作为this值和一个空参数列表
  • 如果val是原语值,则返回val.

您可以在json中获取此对象format@Abhishek,我所期望的是,当我尝试将任何字符串与obj连接起来时,应该调用toString()而不是valueOf()。@am,嗯,我明白了。。这里我不是显式调用toString()方法,而是让JavaScript根据转换场景解释要调用的正确函数…:)@dInGd0nG感谢indentationObject到primitive的转换可以分为“Object到string”或“Object到数字”。在本例中,您建议JavaScript选择哪种转换类型?我认为“objecttostring”是因为我写的是“hello”+obj,即字符串连接。你可以看到链接中提供的注释部分。感谢Jan为我指出规范。。。。