In Javascript why do Date objects have both valueOf and getTime methods if they do the same?
The Date.prototype.getTime
method returns the number of milliseconds since the epoch (1970-01-01T00:00:00Z); it is unique to the Date type and an important method.
The Object.prototype.valueOf
method is used to get the "primitive value" of any object and is used by the language internally when it needs to convert an object to a primitive. For the Date class, it is convenient to use the "time" attribute (the value returned by getTime()
) as its primitive form since it is a common representation for dates. Moreover, it lets you use arithmetic operators on date objects so you can compare them simply by using comparison operators (<
, <=
, >
, etc).
var d = new Date();
d.getTime(); // => 1331759119227
d.valueOf(); // => 1331759119227
+d; // => 1331759119227 (implicitly calls "valueOf")
var d2 = new Date();
(d < d2); // => true (d came before d2)
Note that you could implement the "valueOf" method for your own types to do interesting things:
function Person(name, age) {this.name=name; this.age=age;}
Person.prototype.valueOf = function() {return this.age; }
var youngster = new Person('Jimmy', 12);
var oldtimer = new Person('Hank', 73);
(youngster < oldtimer); // => true
youngster + oldtimer; // => 85
There are no difference in behaviour between those two functions:
https://code.google.com/p/v8/codesearch#v8/trunk/src/date.js&q=ValueOf&sq=package:v8&l=361
// ECMA 262 - 15.9.5.8
function DateValueOf() {
return UTC_DATE_VALUE(this);
}
// ECMA 262 - 15.9.5.9
function DateGetTime() {
return UTC_DATE_VALUE(this);
}
But there are historical differences.
valueOf
is a method of all objects. Objects are free to override this to be what they want.