"12"+ {"x":"1",toString(){返回 10;},valueOf(){返回 90}};在 Javascript 中计算上述表达式

问题描述 投票:0回答:1

console.log("12"+ {"x":"1",toString(){return 10;},valueOf(){return 90}});

在上面的表达式中,为什么没有调用 toString() 方法?根据算法,如果左侧或右侧有字符串,则我们调用 ToString() 并提示另一侧为“String”,如果提示为“String”,则将首先调用 toString() 方法,然后调用 valueOf () 方法。但上面的表达式给出的答案是“1290”mean valueOf()被调用。

加法表达算法:-

12.8.3The Addition Operator ( + )
NOTE
The addition operator either performs string concatenation or numeric addition.
12.8.3.1Runtime Semantics: Evaluation
AdditiveExpression:AdditiveExpression+MultiplicativeExpression
Let lref be the result of evaluating AdditiveExpression.
Let lval be ? GetValue(lref).
Let rref be the result of evaluating MultiplicativeExpression.
Let rval be ? GetValue(rref).
Let lprim be ? ToPrimitive(lval).
Let rprim be ? ToPrimitive(rval).
If Type(lprim) is String or Type(rprim) is String, then
Let lstr be ? ToString(lprim).
Let rstr be ? ToString(rprim).
Return the string-concatenation of lstr and rstr.
Let lnum be ? ToNumber(lprim).
Let rnum be ? ToNumber(rprim).
Return the result of applying the addition operation to lnum and rnum. See the Note below 12.8.5.

ToString 规则:-

7.1.12ToString ( argument )
The abstract operation ToString converts argument to a value of type String according to Table 11:

Table 11: ToString Conversions

ToString 转换表:

根据ToString转换表,如果有对象则提示“String”。

请帮我解决这个问题,为什么 valueOf() 方法是首选。

javascript coercion type-coercion
1个回答
0
投票

13.8.1 加法运算符 ( + )

ApplyStringOrNumericBinaryOperator
来指定,其中

  • lval
    "12"
  • opText
    +
  • rval
    {"x":"1",toString(){return 10;},valueOf(){return 90}})

据我所知,

rprim := ToPrimitive(rval)
最终会调用
OrdinaryToPrimitive(..., "number")
,它更喜欢
valueOf
而不是
toString

© www.soinside.com 2019 - 2024. All rights reserved.