2016-08-13 28 views
1
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

答案对我来说似乎很明显。它似乎在与字符串连接时使用从'valueOf'返回的值。 – kamoroso94

+0

我不明白你在问什么。哪个对象获得5的值?只是尝试在浏览器的控制台以下: 'V = { 的valueOf:函数(){回报5}, 的toString:函数(){回报 '富'}} 临时 = '' + V; Number.isInteger(temp);' 你会看到最后一条命令会打印出false;因此空字符串加上一个对象似乎不等于一个数字。 – alptugd

+0

@ kamoroso94我在问为什么v对象会从valueOf中获取值而不是toString中的foo,或者为什么它不会尝试向对象添加空字符串并返回类似NaN或undefined的内容? – MattGoldwater

回答

5

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

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


如果你问为什么加入( +)运算符返回算术加法(调用v.valueOf())而不是并置,您需要参考ECAMScript规范中的答案。 Section 11.6.1谈论加法运算符。这里是相关的位:

  1. 让lprim为ToPrimitive(lval)。
  2. 让rprim成为原始(rval)。
  3. 如果Type(lprim)是字符串或类型(rprim)的字符串,则返回字符串即串联接着的ToString(rprim)的ToString(lprim)
  4. 返回应用加法运算的结果的结果ToNumber(lprim)和ToNumber(rprim)。

它看起来像操作数应该数种之前被解析成字符串类型,让你的表达''+v应该叫v.toString()第一,从而返回foo,对不对?

其实没有。因为在第5步和第6步中,两个操作数首先被分解为它们的基元,并且这个分辨率在没有“提示”的情况下完成。当没有提示传递给ToPrimitive时,对象返回它们的默认值,这是valueOf()方法的返回值。请参阅9.1部分了解对象如何解析为其基元。

+0

不知道valueOf!谢谢 – MattGoldwater

相关问题