一个空字符串加上一个对象如何等于一个数字

How can an empty string plus an object equal a number

v = {
toString: function () { return 'foo' },  
valueOf: function () { return 5 }
}
console.log('' + v); //5
console.log(v); // { [Number: 5] toString: [Function], valueOf: [Function] }

为什么v对象得到的值为5?

您正在创建一个对象,v,并将其 valueOf() 方法覆盖为 return 整数 5。如果对象没有明确的 valueOf() 方法定义,然后 valueOf() returns 对象本身。 JavaScript 中的所有内置核心对象都将此方法覆盖为 return 适当的值。例如,执行以下操作:

x = 5;
console.log(x)

真的在做:

console.log(x.valueOf()) // log the return value of x.valueOf()

您可以在此处阅读有关 valueOf() 的更多信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/valueOf


如果您询问为什么加法 (+) 运算符 return 是算术加法(调用 v.valueOf())而不是连接,您需要参考 ECAMScript 规范以了解回答。 Section 11.6.1 谈论加法运算符。这是相关位:

  1. Let lprim be ToPrimitive(lval).
  2. Let rprim be ToPrimitive(rval).
  3. If Type(lprim) is String or Type(rprim) is String, then Return the String that is the result of concatenating ToString(lprim) followed by ToString(rprim)
  4. Return the result of applying the addition operation to ToNumber(lprim) and ToNumber(rprim).

看起来应该在数字类型之前将操作数解析为字符串类型,因此您的表达式 ''+v 应该首先调用 v.toString(),因此 return foo,对吗?

实际上,没有。因为在第 5 步和第 6 步中,两个操作数都首先解析为它们的基元,而这个解析是在没有 "hint" 的情况下完成的。当没有提示传递给 ToPrimitive 时,Objects return 它们的默认值,即 valueOf() 方法的 return。请参阅第 9.1 部分,了解对象如何解析为其基元。