一尘不染

JavaScript中的valueOf()与toString()

javascript

在Javascript中,每个对象都有一个valueOf()和toString()方法。我本以为每当需要进行字符串转换时,都会调用toString()方法,但显然它被valueOf()压倒了。

例如,代码

var x = {toString: function() {return "foo"; },
         valueOf: function() {return 42; }};
window.console.log ("x="+x);
window.console.log ("x="+x.toString());

将打印

x=42
x=foo

例如,如果x是一个复数,这会让我感到反感。例如,我希望valueOf()给出其大小,但是每当我想转换为字符串时,我都会想要类似“ a +
bi”的东西。而且我不想在隐含字符串的上下文中显式调用toString()。

这就是它的样子吗?


阅读 279

收藏
2020-05-01

共1个答案

一尘不染

(“ x =” + x)给出“ x = value”而不是“x=tostring”的原因如下。当评估“+”时,javascript首先收集操作数的原始值,然后根据每个原始类型确定是否应应用加法或串联。

所以,这就是您的想法

a + b:
    pa = ToPrimitive(a)
    if(pa is string)
       return concat(pa, ToString(b))
    else
       return add(pa, ToNumber(b))

这就是实际发生的情况

a + b:
    pa = ToPrimitive(a)
    pb = ToPrimitive(b)*
    if(pa is string || pb is string)
       return concat(ToString(pa), ToString(pb))
    else
       return add(ToNumber(pa), ToNumber(pb))

也就是说,toString应用于valueOf的结果,而不是原始对象。


*在字符串上下文中调用时,ToPrimitive确实会调用toString,但这不是这种情况,因为’+’不会强制​​执行任何类型上下文。

2020-05-01