在Javascript中,为什么Date对象同时具有valueOf和getTime方法?

Att*_*Kun 33 javascript date

MDN说valueOfgetTime在功能上是等价的.为什么有两个功能完全相同?

mae*_*ics 41

Date.prototype.getTime方法返回自纪元以来的毫秒数(1970-01-01T00:00:00Z); 它是Date类型所特有的,也是一种重要的方法.

Object.prototype.valueOf方法用于获取任何对象的"原始值".对于Date类,使用"time"属性(返回的值getTime())作为其原始形式是很方便的,因为它是日期的通用表示.此外,它可以让您使用日期对象的算术运算符,所以你可以简单地通过使用比较操作符(对它们进行比较<,<=,>,等).

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)
Run Code Online (Sandbox Code Playgroud)

请注意,您可以为自己的类型实现"valueOf"方法来执行有趣的操作:

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
Run Code Online (Sandbox Code Playgroud)

  • @Karl,`getTime()`的唯一目的是返回自UTC时间1970年1月1日午夜以来的毫秒数.而`valueOf()`返回一个值 - 它可能是一个字符串,一个数字但不是一个对象类 - 因此是原始类型.可能用于比较的东西,数字表示.我想语言设计者认为你已经可以使用`getTime()`来实现这个目的并且只是使用它.它可能是以不同的方式实现的,但为方便起见,它们使用了`getTime()`. (3认同)
  • 请注意,`+ d`与`0 + d`不同.后者将Date转换为String. (2认同)
  • 注意,虽然d &lt;d2将起作用,但是d == d2对于** any ** d和d2返回false。因此,d &lt;= d2和d&gt; = d2将不能正确地对待相等的值。要正确比较相等的值,您需要使用d.valueOf()&lt;= d2.valueOf()或其等效的getTime。 (2认同)

csi*_*nos 12

这两个函数之间的行为没有区别:

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);
}
Run Code Online (Sandbox Code Playgroud)

但是有历史的差异.


Roc*_*mat 5

valueOf是所有对象的方法。对象可以随意覆盖它,使其成为所需对象。

  • 如果我们认为getTime是在JavaScript 1.0中引入的,而valueOf是在JavaScript 1.1中引入的,这是有道理的。我的猜测是,保留了getTime是为了向后兼容。 (7认同)