0

我正在玩 JavaScript 中的对象到字符串的转换。所有对象都继承两个转换函数 -toString()valueOf(). 当 JavaScript 尝试将对象转换为字符串时,它会搜索toString()实现,然后再搜索valueOf()实现。所以我以这种方式覆盖了toString()and :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吗?

感谢任何帮助。

4

2 回答 2

2

在 中console.log("hello " + obj);,执行 is 的类型转换的运算符obj+称为加法运算符。

在加法运算符中,不是将每个参数强制转换为字符串,而是将每个参数强制转换为没有类型提示的原始值。当对象被强制转换为没有类型提示的基元时,valueOf如果可用,则使用该方法。仅当valueOf不可调用或返回非原始值时才toString使用。如果两者都valueOf返回toString非原始值,TypeError则抛出 a。


引用规范:

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

...

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

http://es5.github.com/#x8.12.8

8.12.8 [[DefaultValue]](提示)

当 O 的 [[DefaultValue]] 内部方法在没有提示的情况下被调用时,它的行为就好像提示是 Number 一样,除非 O 是 Date 对象(参见 15.9.6),在这种情况下,它的行为就好像提示是细绳。

...

当 O 的 [[DefaultValue]] 内部方法用提示 Number 调用时,采取以下步骤:

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

  • 令 val 为调用 valueOf 的 [[Call]] 内部方法的结果,其中 O 作为 this 值和一个空参数列表。
  • 如果 val 是原始值,则返回 val。
    ...
于 2013-02-23T09:38:13.977 回答
0

如果您要添加带有对象的字符串,它会尝试转换为原始值,这就是调用 valueOf 而不是 toString 的原因

https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/valueOf

于 2013-02-23T09:22:32.193 回答