JS valueOf和toString

时间:2015-03-23 18:32:40

标签: javascript tostring

xy中发生了什么样的咒语?

var x = new Date;
var y = {
    toString: function() {
        return x.toString();
    },
    valueOf: function() {
        return x.valueOf();
    }
};

String(x) // "Mon Mar 23 2015 18:26:40 GMT+0000 (GMT)"
String(y) // "Mon Mar 23 2015 18:26:40 GMT+0000 (GMT)"
'' + x    // "Mon Mar 23 2015 18:26:40 GMT+0000 (GMT)"
'' + y    // "1427135200422"

我是否认为x具有ToString作为日期字符串的主要价值,但y没有主要价值?

编辑:

对于它的价值,以下工作(ES6在这里):

var y = {
    [Symbol.toPrimitive](...args) {
        return x[Symbol.toPrimitive](...args);
    }
};

2 个答案:

答案 0 :(得分:3)

来自规范的第8.12.8节:

  

当没有提示调用O的[[DefaultValue]]内部方法时,它的行为就好像提示是Number,除非O是Date对象(见15.9.6),在这种情况下它的行为就好像提示是String。

+运算符传递“PreferredType”提示,其行为就像没有提示一样(虽然规范不能很好地解释,或者如果它没有,我找不到它)。因此,x对象“更喜欢”其字符串表示,而y对象使用数字表示。

答案 1 :(得分:2)

+的行为在

中定义
  

11.6.1 The Addition operator ( + )

     

生产 AdditiveExpression AdditiveExpression +    MultiplicativeExpression 评估如下:

     
      
  1. lref 成为评估AdditiveExpression的结果。
  2.   
  3. lval GetValue lref )。
  4.   
  5. rref 成为评估MultiplicativeExpression的结果。
  6.   
  7. rval GetValue rref )。
  8.   
  9. lprim ToPrimitive lval )。
  10.   
  11. rprim ToPrimitive rval )。
  12.   
  13. 如果Type lprim )是字符串或Type rprim )是字符串,那么   
        
    1. 返回串联ToString lprim )后跟ToString rprim
    2. 的结果的字符串   
  14.   
  15. 将添加操作的结果返回到ToNumber lprim )和ToNumber rprim )。请参阅下面的注释11.6.3
  16.         

    注1 - 在步骤5中对ToPrimitive的调用中未提供任何提示   6.除Date对象之外的所有本机ECMAScript对象都处理   没有提示,好像给出了提示号;日期对象   处理没有提示,就好像给出了提示字符串一样。主办   对象可能会以其他方式处理缺少提示。

因此,根据ToPrimitive[[DefaultValue]]的定义,

  • ToPrimitive为x.toString()返回x,因为x是一个Date对象,所以它就像提示一样是String。

  • ToPrimitive为y.valueOf()返回y,因为y是非Date本机对象,所以它的提示类似于数字。

因此,加法运算符返回不同的结果。