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() 方法是首选。
ApplyStringOrNumericBinaryOperator
来指定,其中
lval
是 "12"
opText
是 +
rval
是 {"x":"1",toString(){return 10;},valueOf(){return 90}})
rprim := ToPrimitive(rval)
最终会调用OrdinaryToPrimitive(..., "number")
,它更喜欢valueOf
而不是toString
。