【问题标题】:How can an empty string plus an object equal a number一个空字符串加上一个对象怎么能等于一个数字
【发布时间】:2016-08-13 21:22:25
【问题描述】:
v = {
toString: function () { return 'foo' },  
valueOf: function () { return 5 }
}
console.log('' + v); //5
console.log(v); // { [Number: 5] toString: [Function], valueOf: [Function] }

为什么 v 对象的值是 5?

【问题讨论】:

  • 答案对我来说似乎很明显。与字符串连接时,它似乎正在使用从valueOf 返回的值。
  • 我不明白你在问什么。哪个对象的值是 5?只需在浏览器的控制台中尝试以下操作:v = { valueOf: function () { return 5 }, toString: function () { return 'foo' } } temp = '' + v; Number.isInteger(temp); 您会看到最后一个命令将打印出 false;因此空字符串加上一个对象似乎不等于一个数字。
  • @kamoroso94 我在问为什么 v 对象会从 valueOf 而不是 foo 从 toString 获取值,或者为什么它不会尝试向对象添加空字符串并返回类似 NaN 或未定义?
  • 首先,你永远不会通过连接空字符串得到undefinednullNaN。你应该总是得到一个新的字符串。现在解释字符串连接调用vvalueOf 方法的原因在这里stackoverflow.com/q/2485632/2727710 解释。所以这实际上可能是一个重复的问题。

标签: javascript string object addition


【解决方案1】:

您正在创建一个对象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 为 ToPrimitive(rval)。
  3. 如果 Type(lprim) 是 String 或 Type(rprim) 是 String,则返回作为连接 ToString(lprim) 后跟 ToString(rprim) 的结果的 String
  4. 返回对 ToNumber(lprim) 和 ToNumber(rprim) 应用加法运算的结果。

看起来操作数应该在数字类型之前被解析为字符串类型,所以你的表达式''+v应该先调用v.toString(),然后返回foo,对吧?

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

【讨论】:

    猜你喜欢
    • 2023-03-06
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 2021-12-06
    • 1970-01-01
    • 2019-11-09
    • 2019-01-09
    • 1970-01-01
    相关资源
    最近更新 更多