我一直在乱用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 ?
答案 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
等于运算符并不总是可传递的。例如, 可能有两个不同的String对象,每个对象代表相同的对象 字符串值。
每个String对象都被视为等于 ==运算符的字符串值,但两个String对象不会 相互平等。例如:
new String("a") == "a" //true "a" == new String("a") //true
但
new String("a") == new String("a") //false.