Javascript中的valueOf()与toString()

在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()。


这只是它的方式吗?

慕码人8056858
浏览 355回答 3
3回答

哔哔one

(“x =”+ x)给出“x =值”而不是“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的结果,而不是原始对象。有关进一步参考,请参阅ECMAScript语言规范中的第11.6.1节“加法运算符”(+)。*在字符串上下文中调用时,ToPrimitive 会调用toString,但这不是这种情况,因为'+'不强制执行任何类型上下文。

呼唤远方

对于内置的Date类,情况似乎并非如此。("" + new Date(0)) === new Date(0).toString()。Date对象toString()在添加到某个东西时似乎总是返回其值
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript