为了账号安全,请及时绑定邮箱和手机立即绑定

Javascript中的valueOf()与toString()

Javascript中的valueOf()与toString()

慕码人8056858 2019-08-30 15:09:12
在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=42x=foo这让我觉得倒退..如果x是一个复数,例如,我希望valueOf()给我它的大小,但每当我想转换成一个字符串我就会想要像“a + bi”这样的东西。而且我不想在隐含字符串的上下文中显式调用toString()。这只是它的方式吗?
查看完整描述

3 回答

?
哔哔one

TA贡献1854条经验 获得超8个赞

(“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,但这不是这种情况,因为'+'不强制执行任何类型上下文。


查看完整回答
反对 回复 2019-08-30
?
呼唤远方

TA贡献1856条经验 获得超11个赞

对于内置的Date类,情况似乎并非如此。("" + new Date(0)) === new Date(0).toString()。Date对象toString()在添加到某个东西时似乎总是返回其值

查看完整回答
反对 回复 2019-08-30
  • 3 回答
  • 0 关注
  • 354 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信