Why does Date addition result in a string?

Viewed 64

I'm trying to understand this behaviour:

var d = new Date();

console.log(+d); // 1458049171381
console.log(1 + d); // '1Tue Mar 15 2016 09:39:31 GMT-0400 (EDT)'

In contrast to:

var obj = {
  valueOf: function () {
    return 123;
  }
};

console.log(+obj); // 123
console.log(1 + obj); // 124

Why does the Date addition result in a string when Date.prototype.valueOf returns a number?

Here is naive translation of the Addition Operator's spec to JavaScript

function ToPrimitive(x) {
  return x.valueOf();
}

function IsString(x) {
  return typeof x === 'string';
}

function ToString(x) {
  return x.toString();
}

function ToNumber(x) {
  try {
    return parseFloat(x);
  } catch (e) {
    return NaN;
  }
}

function AdditionOperator(lval, rval) {

  let lprim = ToPrimitive(lval);
  let rprim = ToPrimitive(rval);

  if (IsString(lprim) || IsString(rprim)) {
    return ToString(lprim) + ToString(rprim);
  } else {
    return ToNumber(lprim) + ToNumber(rprim);
  }
}

However, if I invoke this with a Date object, it returns a numeric value:

AdditionOperator(new Date(), 1) // 1458049347088

Can someone shed some light on this?

1 Answers
Related