按数字和字符串设置新的 Date() 会给出不同的结果

Setting new Date() by number and string gives different result

本文关键字:结果 Date 数字 字符串 设置      更新时间:2023-09-26

我正在学习JavaScript,我发现了JavaScript的奇怪(?)行为。

我通过以下方式创建日期对象

var stack = new Date(1404187200000) // 07-01-2014
var overflow = new Date('07-01-2014')

当我比较这两个日期对象时

stack == overflow // returns false
stack.getTime() == overflow.getTime() // returns true

我相信这是因为它们不是同一个对象。 但我知道"=="是平等的比较,"==="是身份的比较——就像这个例子:

var stack = 1;
var overflow = '1';
stack == overflow // returns true
stack === overflow // returns false

那么,为什么比较新的日期([NUMBER])和新的日期([字符串])会给出不同的结果,即使它们是相同的日期?

请开导我!

你误解了=====之间的区别。并不是说一个人做平等检查,一个人做参考检查。

对于===,两个操作数必须具有相同的类型。但对于==,在检查相等性之前允许类型强制。

在您的情况下,这两个对象属于同一类型,因此=====之间没有区别;但它们检查的是引用相等性,而不是值。检查值与日期相等的正确方法是:检查是否stack.getTime() == overflow.getTime() .

你也可以做+stack == +overflow,这将首先强制转换它们,然后你会得到一个值相等性测试。

new Date返回一个对象。 每次创建它时,它都会创建一个不同的对象,因此它们不相等。 getTime 从对象返回一个值(属性) - 对于两个对象,这将相同。

这有点复杂。 ===在尝试转换为通用类型时检查==类型。这就是为什么1 == '1'为真,1 === '1'为假,因为在第一种情况下,"1"被转换为数字(AFAIR)。

您可以在此处查看如何处理的确切规范: http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3 - 在这种情况下,对您来说有趣的部分是 1. f。

如果 x 和 y 引用同一对象,则返回 true。否则,返回 false。