一个空字符串加上一个对象如何等于一个数字
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 谈论加法运算符。这是相关位:
- Let lprim be ToPrimitive(lval).
- Let rprim be ToPrimitive(rval).
- 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)
- 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 部分,了解对象如何解析为其基元。
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 谈论加法运算符。这是相关位:
- Let lprim be ToPrimitive(lval).
- Let rprim be ToPrimitive(rval).
- 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)
- 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 部分,了解对象如何解析为其基元。