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

附: StackOverflow上对该问题的讨论

https://stackoverflow.com/a/9710267/12261182

原文地址:https://www.cnblogs.com/jaycethanks/p/14559450.html