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

时间:2016-08-13 21:22:25

标签: javascript string object addition

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

为什么v对象的值为5?

1 个答案:

答案 0 :(得分:5)

您正在创建一个对象v,并覆盖其valueOf()方法以返回整数5.如果对象没有定义明确的valueOf()方法,那么{{1返回对象本身。 JavaScript中的所有内置核心对象都会覆盖此方法以返回适当的值。例如,执行以下操作:

valueOf()

真的在做:

x = 5;
console.log(x)

您可以在此处详细了解console.log(x.valueOf()) // log the return value of x.valueOf() https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/valueOf

如果您询问为什么加法(+)运算符返回算术加法(调用v.valueOf())而不是连接,则需要参考ECAMScript规范以获得答案。 Section 11.6.1讨论了加法运算符。这是相关的一点:

  
      
  1. 让lprim为ToPrimitive(lval)。
  2.   
  3. 让rprim为ToPrimitive(rval)。
  4.   
  5. 如果Type(lprim)是String或Type(rprim)是String,则返回串联ToString(lprim)后跟ToString(rprim)的结果的字符串
  6.   
  7. 将添加操作的结果返回到ToNumber(lprim)和ToNumber(rprim)。
  8.   

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

实际上,没有。因为在步骤5和6中,两个操作数首先被解析为它们的基元,并且这个分辨率在没有"提示"的情况下完成。如果没有传递给ToPrimitive的提示,则对象将返回其默认值,即foo方法的返回值。有关对象如何解析为其基元的信息,请参阅9.1部分。