I am trying to understand this behavior:
var d = new Date(); console.log(+d);
Unlike:
var obj = { valueOf: function () { return 123; } }; console.log(+obj);
Why is the result of adding Date
to string
when Date.prototype.valueOf
returns number
?
Here is the naive translation specification of the add operator in 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 call this with a Date
object, it returns a numeric value:
AdditionOperator(new Date(), 1)
Can someone shed some light on this?
source share