date.getTime() 和 date.valueOf() 的区别
1. 简述
在JavaScript 中, date
对象的 getTime()
方法 将会返回一个该对象所对应的毫秒数,如:
new Date().getTime()
//1616156247371
date
对象的valueOf()
方法也会返回当前对象的毫秒数,如:
> new Date().valueOf()
//1616156369847
**这两个方法,返回的值类型都是number
, 特别注意valueOf()
方法的返回值并不是字符串 **
This method is functionally equivalent to the
Date.prototype.getTime()
method.@MDN
valueOf()
方法和Date.prototype.getTIme()
功能是相同的。
2. 理解
我们已经知道了这二者在功能上是一致的,那么为什么JavaScript中会有这两个相同作用的方法呢?
其实,并不是完全一样。
date
对象的valueOf()方法
valueOf()
方法并不是date
对象特有的方法,在JavaScript中,所有的对象都派生自Object, 是Object的实例(通过new
关键字实例化), 而valueOf()
方法正是继承自Object。该方法返回对应的字符串,数值或者布尔值表示。
所以,实际上valueOf()
是每一个对象类型都拥有的方法,且不同的对象,该方法的表现也不相同。
以下是一个简单的测试:
let str = new String('hello world');
console.log(str.valueOf())
console.log(typeof(str.valueOf()));
//hello world
//string
let num = new Number(10);
console.log(num.valueOf())
console.log(typeof(num.valueOf()));
//10
//number
let bool = new Boolean(true);
console.log(bool.valueOf())
console.log(typeof(bool.valueOf()));
//true
//boolean
以上,是对几个基本数据类型的测试,结果也如同我们心中期望的。 但是如果是对引用类型(对象),则不同:
let cusObj = new Object({});
cusObj.name = "jayce";
cusObj.age = "25";
console.log(cusObj)
console.log(cusObj.valueOf())
console.log(typeof(cusObj.valueOf()));
//{ name: 'jayce', age: '25' }
//{ name: 'jayce', age: '25' }
//object
可以看到,对于对象类型,其valueOf()
方法依旧是对象,而不是被转换成基本数据类型,如字符串。
那么问题就来了,date
对象明显不是基本数据类型, 为什么 他返回的是number
?
Date类型的
valueOf()
方法根本就不返回字符串,这个方法被重写后返回的是日期的毫秒表示@《高程4》
所以从来源上来说,getTime()
是Date对象的一个特有方法, 而valueOf()
是一个通用的对象方法,且在Date对象的实现上,还被重写了。
getTime()
常用于显示的调用,而valueOf()
通常是隐式调用
如果,你需要把当前,或者某个指定的时间的Date对象转换或者说获取到一个number类型的毫秒数, 那么首要方法就是通过getTime()
, 而不是valueOf()
为什么呢?怎么体现隐式调用?
通常,有一个场景是比较容易体现关于valueOf()
方法的隐式调用的:
值大小比较
例如:
在值的大小比较时,如果有任一操作数是对象,则会调用其valueOf()
方法,取得结果后在去比较。 所以,
let firstTimeNode = new Date(2021,2,18);
let laterTimeNode = new Date(2021,2,19);
console.log(firstTimeNode > laterTimeNode);//false
console.log(firstTimeNode < laterTimeNode);//true