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 = {
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()
方法返回整数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谈论加法运算符。这里是相关的位:
- 让lprim为ToPrimitive(lval)。
- 让rprim成为原始(rval)。
- 如果Type(lprim)是字符串或类型(rprim)的字符串,则返回字符串即串联接着的ToString(rprim)的ToString(lprim)
- 返回应用加法运算的结果的结果ToNumber(lprim)和ToNumber(rprim)。
它看起来像操作数应该数种之前被解析成字符串类型,让你的表达''+v
应该叫v.toString()
第一,从而返回foo
,对不对?
其实没有。因为在第5步和第6步中,两个操作数首先被分解为它们的基元,并且这个分辨率在没有“提示”的情况下完成。当没有提示传递给ToPrimitive时,对象返回它们的默认值,这是valueOf()
方法的返回值。请参阅9.1部分了解对象如何解析为其基元。
不知道valueOf!谢谢 – MattGoldwater
答案对我来说似乎很明显。它似乎在与字符串连接时使用从'valueOf'返回的值。 – kamoroso94
我不明白你在问什么。哪个对象获得5的值?只是尝试在浏览器的控制台以下: 'V = { 的valueOf:函数(){回报5}, 的toString:函数(){回报 '富'}} 临时 = '' + V; Number.isInteger(temp);' 你会看到最后一条命令会打印出false;因此空字符串加上一个对象似乎不等于一个数字。 – alptugd
@ kamoroso94我在问为什么v对象会从valueOf中获取值而不是toString中的foo,或者为什么它不会尝试向对象添加空字符串并返回类似NaN或undefined的内容? – MattGoldwater