Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么(new Date()==new Date())为false,而(Date()==Date())为true?_Javascript_Date_Equality - Fatal编程技术网

Javascript 为什么(new Date()==new Date())为false,而(Date()==Date())为true?

Javascript 为什么(new Date()==new Date())为false,而(Date()==Date())为true?,javascript,date,equality,Javascript,Date,Equality,我一直在用JSFIDLE来解决FreeCodeCamp中的问题。当我使用日期作为字符串时(即,无“新”): 案例1: function isSameDay (dtFrom, dtTo) { return dtFrom == dtTo } let today = Date() let tomorrow = Date() console.log(today) console.log(tomorrow) console.log(isSameDay(today, to

我一直在用JSFIDLE来解决FreeCodeCamp中的问题。当我使用日期作为字符串时(即,无“新”):

案例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

使用
Date()
,JavaScript日期对象只能通过将JavaScript日期作为构造函数调用来实例化:将其作为常规函数调用(即不使用新运算符)将返回字符串而不是日期对象

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

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

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

而在其他情况下,则比较日期的
toString()

有关
==

附注3

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

每个字符串对象将被视为等于 由==运算符指定的字符串值,但这两个字符串对象不会 彼此平等。例如:

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

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

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

同一构造函数的两个实例仍然彼此不同,即使它们具有完全相同的属性,因为它们是不同的对象。如果要比较日期,请将其强制转换为毫秒,并将其转换为整数。另外,sicne new Date()返回当前时间戳,两个新的Date()调用之间可能存在毫秒的差异。。。但是
Date()
返回一个字符串,因此它在大多数情况下都是==字符串。。。除非秒数超过
将其转换为毫秒
。。。但是时不时地
new Date().getTime()==new Date().getTime()
是错误的。。。因为对new Date()的两次调用之间可以有一毫秒的间隔。。。不太可能使用
Date()==Date()
-因为它是一个分辨率为1秒的字符串。。。但是仍然可能是错误的。你可以除以准确度,或者减去并计算它们之间的时间,这取决于你是在比较小时、分、秒还是其他。与使用日期方法或生成的字符串相比,转换为毫秒的意义在于能够使用“简单”的数学运算,而不必担心本地化。感谢您的回复,我不知道({})!=({}). 如果这是一个重复的问题,请道歉。请确保每个实例都是唯一的,但您不能使用相同的参数来表示var a='a';var b=‘a’;a==b;应该评估为假吗?毕竟,它们是不同的例子。还有,为什么所有其他比较(如etc)都应该使用日期对象,但==是一个不起作用的例外。似乎是为了混淆。@tobuslieven抱歉,但是
var a='a';var b=‘b’;a===b
等于false。@tobuslieven这是抽象等式比较算法中的设计。下面是我的答案,当其他比较等根据各自的日期正常工作时,为什么等式应该只关心对象引用?这是
=
运算符的一个特点。相等不是通过值而是通过引用来实现的不像
>,哇,这很有趣。不得不说这似乎是个糟糕的选择。你知道为什么他们认为这个例外应该存在吗?我看不出有什么好处。确实很有趣。谢谢你的回复!
new String("a") == new String("a") //false.