v = {
toString: function () { return 'foo' },
valueOf: function () { return 5 }
}
console.log('' + v); //5
console.log(v); // { [Number: 5] toString: [Function], valueOf: [Function] }
为什么v对象的值为5?
答案 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讨论了加法运算符。这是相关的一点:
- 让lprim为ToPrimitive(lval)。
- 让rprim为ToPrimitive(rval)。
- 如果Type(lprim)是String或Type(rprim)是String,则返回串联ToString(lprim)后跟ToString(rprim)的结果的字符串
- 将添加操作的结果返回到ToNumber(lprim)和ToNumber(rprim)。
醇>
看起来应该在数字类型之前将操作数解析为字符串类型,因此表达式valueOf()
应首先调用''+v
,然后返回v.toString()
,对吗?
实际上,没有。因为在步骤5和6中,两个操作数首先被解析为它们的基元,并且这个分辨率在没有"提示"的情况下完成。如果没有传递给ToPrimitive的提示,则对象将返回其默认值,即foo
方法的返回值。有关对象如何解析为其基元的信息,请参阅9.1部分。