zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    JavaScript函数中的this四种绑定形式
    jQuery的html()、text()和val()的使用和区别
    iframe-父子-兄弟页面相互传值(jq和js两种方法)
    Spring Boot 嵌入式 Tomcat 文件上传、url 映射虚拟路径
    SpringMVC上传图片
    <iframe>和<frame>标签属性详解
    Mybatis 事物回滚最简单的操作方式
    SpringBoot配置log4j
    springboot整合redis(集群)
    Maven setting.xml简易配置
  • 原文地址:https://www.cnblogs.com/jaycethanks/p/14559450.html
Copyright © 2011-2022 走看看