为什么(new Date()== new Date())为false,但是(Date()== Date())为真?

时间:2017-02-01 12:44:12

标签: javascript date equality

我一直在乱用JSFiddle来解决FreeCodeCamp中的this问题。当我使用Date作为字符串时(即,没有" new"):

案例1:

function isSameDay (dtFrom, dtTo) {
    return dtFrom == dtTo
  }

  let today = Date()
  let tomorrow = Date()

  console.log(today)
  console.log(tomorrow)
  console.log(isSameDay(today, tomorrow))

isSameDay返回 true 。但是,当我使用Date作为构造函数时(使用" new"):

案例2:

function isSameDay (dtFrom, dtTo) {
    return dtFrom == dtTo
  }

  let today = new Date()
  let tomorrow = new Date()

  console.log(today)
  console.log(tomorrow)

  console.log(isSameDay(today, tomorrow))

isSameDay返回 false 。但是(!),当我添加一元运算符" +":

案例3:

function isSameDay (dtFrom, dtTo) {
    return dtFrom == dtTo
  }

  let today = + new Date()
  let tomorrow = + new Date()

  console.log(today)
  console.log(tomorrow)

  console.log(isSameDay(today, tomorrow))

isSameDay返回 true 。我理解案例1和案例3返回true,因为它们只是相同的字符串和相同的毫秒值。

为什么案例2会返回 false

2 个答案:

答案 0 :(得分:7)

使用Date(),JavaScript Date对象只能通过调用JavaScript Date作为构造函数来实例化:将其称为常规函数(即没有new运算符)将返回一个字符串而不是Date对象。 MDN Reference

typeof Date()    //"string"
Date() == Date() //true

使用构造函数作为new Date(),每个实例都是唯一的(同一个构造函数的两个实例仍然彼此不同),这就是它们在比较时不相等的原因。

typeof new Date();        //"object"
new Date() === new Date() //false

答案 1 :(得分:3)

简单地说,Case 2返回false,因为您正在比较两个不同的对象引用(即使两个对象都包含 exact 相同的属性)。

而在其他情况下,您要比较日期的toString()值。

请参阅== Abstract Equality Algorithm

的官方文档中的注释3
  

注3

     

等于运算符并不总是可传递的。例如,   可能有两个不同的String对象,每个对象代表相同的对象   字符串值。

     

每个String对象都被视为等于   ==运算符的字符串值,但两个String对象不会   相互平等。例如:

new String("a") == "a" //true

"a" == new String("a") //true 
     

new String("a") == new String("a") //false.